std::to_string是C++11起转换算术类型为string的标准方法,支持int、double等,需#include ,不支持指针或自定义类型;对负数、零、INT_MIN处理可靠;格式化需求(如补零、十六进制)应改用sprintf。

to_string 是 C++11 起的标准方式
直接用 std::to_string,无需手动拼接或依赖 stringstream。它支持 int、long、double 等基本数值类型,返回 std::string。
常见错误是忘记加 #include ,或者误以为它能转指针或自定义类型——它只接受算术类型。
-
std::to_string(42)→"42" -
std::to_string(-7)→"-7" -
std::to_string(0)→"0" - 不能写
std::to_string(nullptr)或std::to_string(my_struct),会编译失败
负数和零的转换完全没问题
to_string 对符号位和零值处理是可靠的,内部调用的是标准库的格式化逻辑,不是简单去符号再拼接。
不用额外判断正负,也不用担心前导零或空字符串问题——这些都由标准保证。
立即学习“C++免费学习笔记(深入)”;
-
std::to_string(INT_MIN)(如 -2147483648)能正确输出完整数字串 -
std::to_string(0)就是"0",不是空串也不是"00" - 结果不含空格、制表符或换行,纯数字字符序列
替代方案:sprintf + std::string 构造(仅限需要控制格式时)
如果要补零、指定宽度或十六进制(比如 "0042" 或 "2a"),to_string 不行,得换方法。
这时推荐用 sprintf 到栈上缓冲区再构造 std::string,比 std::stringstream 更轻量且可控。
-
char buf[16]; sprintf(buf, "%04d", 42); std::string s(buf);→"0042" -
sprintf(buf, "%x", 42);→"2a"(注意不带0x前缀) - 缓冲区大小要足够,
int十进制最多 11 字符(含负号),留 16 安全 - 避免用
snprintf返回值做长度判断——在 Windows MSVC 上行为略有差异,保守起见直接用固定大小 +sprintf
不要用 std::stringstream 做简单 int→string
虽然能用,但开销明显更大:构造流对象、设置状态、内部缓冲管理。对高频转换(比如日志拼接、循环内)有可观性能损失。
除非你已经在用 stringstream 做复合格式化(比如同时塞字符串、数字、变量名),否则没必要为单个 int 引入它。
- ❌
std::ostringstream oss; oss - ✅
std::string s = std::to_string(42); - Clang/GCC 在 O2 下能将
to_string内联为极简代码;stringstream即使优化后仍涉及虚函数调用和内存分配
真正容易被忽略的是:某些嵌入式平台或老编译器(如 GCC 4.6 之前)不支持 to_string,此时必须查 __cplusplus 宏或用替代方案。但只要明确要求 C++11+,就该无条件首选它。










