C++中用数组反转字符串后输出出现随机字符,求调试帮助
字符串反转后出现乱码的问题排查与修复
你的问题根源在于C风格char数组作为字符串使用时,必须以空字符'\0'结尾。cout输出char数组时,会从数组起始位置一直读取内存,直到遇到'\0'才停止。你的代码里只把反转后的字符存入了reverse_s数组,没有添加结束符,所以输出时会继续读取数组后面的随机内存数据,就出现了乱码。
修复现有代码的方法
- 给
reverse_s数组多分配1个字节的空间,用来存放结束符:
把char reverse_s[lenOfStr];改成char reverse_s[lenOfStr + 1]; - 在循环结束后,手动添加字符串结束符:
在for循环结束后加上reverse_s[j] = '\0';(循环结束时j刚好等于字符串长度,正好是结束符的位置)
修改后的完整代码:
#include<bits/stdc++.h> using namespace std; int main(){ string s; cin>>s; int lenOfStr = s.length(); cout<<lenOfStr<<endl; // 多分配一个字节存结束符 char reverse_s[lenOfStr + 1]; int j=0; for(int i=(lenOfStr-1); i>=0; i--){ reverse_s[j] = s[i]; j++; // 这个判断可以去掉,循环条件i>=0会自动终止循环 // if(j==(lenOfStr)){ // break; // } } // 添加字符串结束符 reverse_s[j] = '\0'; cout<<"Reverse string is "<<reverse_s<<endl; cout<<"The length of my array is "<<sizeof(reverse_s)<<endl; // 注意:原字符串长度为3时,reverse_s有效索引是0-3,访问索引5属于越界,会读取随机数据 // cout<<reverse_s[5]<<endl; return 0; }
更简洁的C++风格写法
既然你已经在用std::string,完全可以直接用STL的反转函数,不需要手动操作char数组,既简洁又不会出错:
#include<bits/stdc++.h> using namespace std; int main(){ string s; cin>>s; int lenOfStr = s.length(); cout<<lenOfStr<<endl; // 直接反转string对象 reverse(s.begin(), s.end()); cout<<"Reverse string is "<<s<<endl; return 0; }
另外提醒:你代码里的cout<<reverse_s[5]<<endl;属于数组越界访问,原字符串长度为3时,reverse_s的有效索引范围是0到3(修改后),访问索引5会读取内存中的随机值,这是未定义行为,建议注释或删除这行。
内容的提问来源于stack exchange,提问作者Nj coder
相关产品推荐
相关产品推荐

