C++中不使用to_string函数向字符串追加整数的原理探究
直接给string追加整数和用to_string结果不同的原因
核心问题解析
你的代码里str1 += a[0]和str2 += to_string(a[0])的本质差异,完全是因为C++里std::string的operator+=重载规则和to_string的功能不同:
1. str1 += a[0]的运行机制
当你执行str1 += a[0]时,a[0]是int类型的13,而std::string的operator+=没有直接接受int的重载版本,这时C++会把int类型的13隐式转换为char类型——也就是把13当成ASCII码值,取对应的字符追加到字符串里。
ASCII码13对应的是回车符(CR),这是一个不可见的控制字符。所以str1最终是两个连续的回车符:
- 长度为2,每个字符的ASCII值都是13
- 反转后还是两个回车符,所以
str1和str1Image相等,输出"Both str1 and str1Image are same"
2. to_string(a[0])的作用
std::to_string是专门用来把整数、浮点数等数值类型,转换成对应的十进制数字字符串的函数。比如传入int类型的13,它会返回字符串"13"。
所以str2 += to_string(a[0])执行两次后,str2变成"1313",反转后是"3131",和原字符串不相等,输出"Not same"。
验证方法(可选)
如果想直观看到差异,可以在代码里加一段输出:
// 输出str1的细节 cout << "str1长度:" << str1.size() << endl; for (char c : str1) { cout << "字符ASCII值:" << (int)c << endl; } // 输出str2的细节 cout << "str2内容:" << str2 << endl; cout << "str2长度:" << str2.size() << endl;
运行后会看到:
- str1长度是2,两个字符的ASCII值都是13
- str2内容是"1313",长度是4
总结
- 直接给
std::string追加int类型时,实际是把整数作为ASCII码转成字符追加,不是数字字符串 - 要把整数转为数字字符串追加,必须用
to_string,或者用stringstream等格式化方式
内容的提问来源于stack exchange,提问作者pawan097
相关产品推荐
相关产品推荐

