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

C++字符数组容量超400时出现乱码问题求助

C++字符串合并程序出现垃圾字符的问题分析与修复

你的程序在增大InputSize后出现大量无关字符,核心原因是代码存在多处未定义行为和逻辑错误,具体问题及修复方案如下:

关键问题点

  • 输入缓冲区残留的换行符未处理
    cin >> AmountOfStrings读取整数后,输入缓冲区会留下一个换行符,第一个cin.getline会直接读取这个空行,导致后续句子输入偏移,还会把数组里的垃圾值混入结果。

  • convertToString函数错误遍历整个数组
    这个函数不管用户输入的实际长度,直接把InputSize大小的整个char数组元素都加到字符串里。而cin.getline只会把输入的字符加上'\0'终止符,数组中未被覆盖的位置都是随机垃圾值,这些就是你看到的无关字符的来源。

  • 未初始化的CleanChar变量
    CleanChar没有被赋值,用它清空StringInput数组时,会把未定义的垃圾值写入数组,反而污染了数组内容。

  • 循环变量重名
    内层for循环的i和外层循环的i重名,虽然不会直接报错,但会降低代码可读性,容易引发逻辑混乱。

  • 冗余头文件包含
    bits/stdc++.h已经包含了<iostream>和<string>,重复include属于冗余代码。

修复后的代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int AmountOfStrings = 1;
    const int InputSize = 600; // 可安全设置任意合理大小
    char StringInput[InputSize];
    
    string FinalString = "";
    
    cout << "amount of connected sentences:";
    cin >> AmountOfStrings;
    // 清除输入整数后残留的换行符,确保后续getline正常读取
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
    for (int i = 0; i < AmountOfStrings; i++){
        cout << "sentence n" << i + 1 << ":\n";
        
        cin.getline(StringInput, InputSize);
        // 直接将char数组转为string,自动识别'\0'终止符,只取有效内容
        FinalString += StringInput;
        
        // 可选:用memset安全清空数组,避免残留垃圾值
        memset(StringInput, 0, sizeof(StringInput));
    }
    
    cout << FinalString << endl;
    return 0;
}

修复说明

  1. 用cin.ignore清除cin >>后的换行符,保证第一个getline能正确读取用户输入的句子。
  2. 移除多余的convertToString函数,直接将char数组赋值给string,string会自动以'\0'为终止符截取有效内容,彻底避免垃圾字符混入。
  3. 用memset安全清空数组(若不需要可省略,因为下次getline会覆盖有效部分)。
  4. 调整循环逻辑,从i=0开始,避免初始的空行读取。
  5. 删除未初始化的CleanChar变量,消除未定义行为。
  6. 合并冗余的cout输出语句,简化代码结构。

内容的提问来源于stack exchange,提问作者Fran gwa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:23:35