將數值轉換為字串的函式

hisun9發表於2024-11-16

在 C++ 中,itoasprintf 是用於將數值轉換為字串的經典函式。然而,它們有一定的侷限性或者安全性問題,現代 C++ 更傾向於使用標準庫的解決方案,如 std::to_stringstd::stringstream,來代替這些函式。

1. itoa 的替代

itoa 是一種將整數轉換為字串的函式,但它不是標準 C 或 C++ 函式(屬於一些特定實現的擴充套件,例如 Windows 上的 MSVC)。

示例:itoa 的用法

#include <iostream>
#include <cstdlib> // 包含 itoa 的標頭檔案

int main() {
    int num = 123;
    char buffer[10];
    itoa(num, buffer, 10); // 將 num 轉換為字串,10 表示十進位制
    std::cout << buffer << std::endl; // 輸出: 123
    return 0;
}

輸出如下:

img

問題:

  • 非標準:itoa 不在 C++ 標準中,跨平臺使用會有相容性問題。

  • 安全問題:需要手動分配緩衝區,容易引發溢位等問題。

替代方案:std::to_string

#include <iostream>
#include <string>

int main() {
    int num = 123;
    std::string result = std::to_string(num); // 轉換為字串
    std::cout << result << std::endl; // 輸出: 123
    return 0;
}

輸出如下:

img

優點:

  • 跨平臺,標準化。

  • 不需要手動分配緩衝區,安全可靠

插句題外話

std::to_string 是 C++ 標準庫中的一個函式,用於將基本型別的數值轉換為字串。它是簡單、直接的數值到字串轉換工具。

標頭檔案

#include <string>

函式定義

std::string to_string(int value);
std::string to_string(long value);
std::string to_string(long long value);
std::string to_string(unsigned value);
std::string to_string(unsigned long value);
std::string to_string(unsigned long long value);
std::string to_string(float value);
std::string to_string(double value);
std::string to_string(long double value);
  • 引數:可以是整型或浮點型變數。

  • 返回值:返回一個表示數值的 std::string 型別的字串。

2. sprintf 的替代

sprintf 是 C 的一個函式,用於將格式化資料寫入字元陣列,功能強大,但存在一些問題。

示例:sprintf 的用法

#include <iostream>
#include <cstdio> // 包含 sprintf 的標頭檔案

int main() {
    int num = 123;
    char buffer[50];
    sprintf(buffer, "Number: %d", num); // 將格式化字串寫入 buffer
    std::cout << buffer << std::endl; // 輸出: Number: 123
    return 0;
}

輸出如下:

img

問題:

  • 緩衝區管理:需要手動分配緩衝區,容易引發緩衝區溢位。

  • 效率問題:在某些場景下不如 C++ 的現代方法高效。

替代方案 1:std::to_string

#include <iostream>
#include <string>

int main() {
    int num = 123;
    std::string result = "Number: " + std::to_string(num); // 簡單拼接
    std::cout << result << std::endl; // 輸出: Number: 123
    return 0;
}

輸出如下:

img

替代方案 2:std::stringstream

#include <iostream>
#include <sstream>
#include <string>

int main() {
    int num = 123;
    std::stringstream ss;
    ss << "Number: " << num; // 使用字串流拼接
    std::string result = ss.str(); // 獲取拼接後的字串
    std::cout << result << std::endl; // 輸出: Number: 123
    return 0;
}

輸出如下:

img

優點:

  • 無需手動分配緩衝區。

  • 型別安全:std::stringstream 能處理不同型別的資料,且更安全。

對比總結

img

選擇建議

  1. 簡單數值到字串:優先使用 std::to_string

  2. 複雜資料拼接:優先使用 std::stringstream

  3. 需要複雜格式化:在現代 C++ 中,推薦使用 std::format(C++20 新增),取代 sprintf。

比如:

#include <iostream>
#include <format> // C++20 格式化庫

int main() {
    int num = 123;
    std::string result = std::format("Number: {}", num);
    std::cout << result << std::endl; // 輸出: Number: 123
    return 0;
}

相關文章