std::to_string 是最直接安全的方式,C++11起标准库提供,类型安全、无需手动管理内存,支持所有有符号/无符号整型,但不支持自定义进制,旧编译器可能不可用。

用 std::to_string 是最直接安全的方式
这是 C++11 起标准库提供的首选方法,无需手动管理内存,类型安全,且对 int、long、double 等内置数值类型都适用。
它内部处理了符号位、进制(固定为十进制)、溢出边界等细节,比手写 stringstream 更轻量。
int num = -42; std::string s = std::to_string(num); // 结果是 "-42"
- 支持所有有符号/无符号整型:如
unsigned int、long long - 不支持自定义进制(比如转成十六进制必须换其他方法)
- 在嵌入式或极老编译器(如 GCC 4.6 以前)中可能不可用
用 std::ostringstream 更灵活但稍重
适合需要格式化控制的场景,比如补零、指定宽度、混入其他类型字符串等。本质是流式拼接,比 to_string 多一层对象构造开销。
int num = 7;
std::ostringstream oss;
oss << std::setw(3) << std::setfill('0') << num;
std::string s = oss.str(); // 结果是 "007"
- 要记得
#include和 -
oss.str()返回的是新字符串,不是引用,不用担心生命周期问题 - 重复使用同一个
ostringstream对象前,需调用oss.str("")清空内容,否则会追加
避免用 itoa —— 它不是标准函数
itoa 是某些 C 库(如 MSVC、glibc 扩展)提供的非标准函数,C++ 标准完全不保证其存在。跨平台项目中直接使用会导致编译失败。
立即学习“C++免费学习笔记(深入)”;
- MSVC 下可能可用,但 GCC/Clang 默认禁用,启用需加
-D_GNU_SOURCE或类似宏 - 参数顺序不统一:有些版本是
(int, char*, int base),有些反着 - 要求传入缓冲区,容易栈溢出(比如
char buf[5]存不下INT_MIN) - 返回值是
char*,不是std::string,还得额外构造
性能与可读性权衡要点
单纯转 int → std::string,std::to_string 在绝大多数场景下最快也最清晰。只有当你已经依赖流操作(比如日志拼接)、或需要运行时切换进制/精度时,才值得引入 ostringstream。
- 不要为“看起来更底层”而用
sprintf+std::string(buf):不安全、不简洁、易出错 - 如果频繁转换且对性能极端敏感(如游戏循环内每帧上百次),可考虑预分配字符串或查表法,但先 profile 确认这里是瓶颈
- 注意
std::to_string(INT_MAX)和std::to_string(INT_MIN)都能正确工作,无需特殊处理
真正容易被忽略的是:不同编译器对 std::to_string 的实现细节略有差异(比如负零、小数点后位数),但对整型输入完全一致。放心用。











