首选 std::to_string:C++11 起标准、安全、无需手动管理内存,支持 int/long/double 等,仅需 ,线程安全且正确处理负数与边界值;sprintf/itoa 有缓冲区溢出或跨平台问题。
直接用 std::to_string,这是 C++11 起标准、安全、无需手动管理内存的首选方式。
它专为基本数值类型设计,支持 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 需预分配字符数组,容易缓冲区溢出:char buf[12]; sprintf(buf, "%d", x); —— 若 x 是 INT_MIN(-2147483648),需至少 12 字节,写错长度就 UBitoa 不是 ISO C++ 标准函数,Windows 和某些嵌入式环境才提供,跨平台代码应避免char*,需额外构造 std::string,多一次拷贝
ream
当要补零、控制进制或拼接其他内容时,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("") 清空内容,否则会追加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 支持
这种需求极少出现在纯整型转字符串场景中,多数情况属于过度设计。