首选 std::to_string:C++11 起标准、安全、无需手动管理内存,支持 int/long/double 等,仅需 ,线程安全且正确处理负数与边界值;sprintf/itoa 有缓冲区溢出或跨平台问题。

直接用 std::to_string,这是 C++11 起标准、安全、无需手动管理内存的首选方式。
std::to_string 是最简方案
它专为基本数值类型设计,支持 int、long、double 等,返回 std::string:
int x = 42; std::string s = std::to_string(x); // s == "42"
- 不依赖
或 C 风格函数,头文件只需 - 线程安全,无静态缓冲区风险
- 对负数、零、边界值(如
INT_MIN)均正确处理 - 性能优于
std::ostringstream,尤其在简单转换场景
为什么不用 sprintf / itoa
sprintf 和非标准的 itoa 存在明显隐患:
-
sprintf需预分配字符数组,容易缓冲区溢出:char buf[12]; sprintf(buf, "%d", x);—— 若x是INT_MIN(-2147483648),需至少 12 字节,写错长度就 UB -
itoa不是 ISO C++ 标准函数,Windows 和某些嵌入式环境才提供,跨平台代码应避免 - 两者都返回
char*,需额外构造std::string,多一次拷贝
需要格式化时用 std::ostringstream
当要补零、控制进制或拼接其他内容时,std::ostringstream 更灵活:
立即学习“C++免费学习笔记(深入)”;
#include#include int x = 7; std::ostringstream oss; oss << std::setw(3) << std::setfill('0') << x; // "007" std::string s = oss.str();
- 支持流操作符,可混合整数、字符串、浮点数等
- 进制切换:用
std::hex、std::oct、std::dec - 但注意:重复使用同一
std::ostringstream对象前,需调用oss.str("")清空内容,否则会追加
自定义 locale 或精度控制必须绕过 to_string
std::to_string 固定使用默认 locale 且无小数位控制(对浮点数),整型虽无小数问题,但若需千分位分隔符(如 "1,000")或特定 locale 的数字规则,只能用 std::ostringstream 配合 std::locale:
std::ostringstream oss;
oss.imbue(std::locale("en_US.UTF-8"));
oss << 1000; // 可能输出 "1,000",取决于系统 locale 支持
这种需求极少出现在纯整型转字符串场景中,多数情况属于过度设计。











