You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中用数组反转字符串后输出出现随机字符,求调试帮助

字符串反转后出现乱码的问题排查与修复

你的问题根源在于C风格char数组作为字符串使用时,必须以空字符'\0'结尾。cout输出char数组时,会从数组起始位置一直读取内存,直到遇到'\0'才停止。你的代码里只把反转后的字符存入了reverse_s数组,没有添加结束符,所以输出时会继续读取数组后面的随机内存数据,就出现了乱码。

修复现有代码的方法

  1. 给reverse_s数组多分配1个字节的空间,用来存放结束符:
    把char reverse_s[lenOfStr];改成char reverse_s[lenOfStr + 1];
  2. 在循环结束后,手动添加字符串结束符:
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:27:51