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; }
修复说明
- 用
cin.ignore清除cin >>后的换行符,保证第一个getline能正确读取用户输入的句子。 - 移除多余的
convertToString函数,直接将char数组赋值给string,string会自动以'\0'为终止符截取有效内容,彻底避免垃圾字符混入。 - 用
memset安全清空数组(若不需要可省略,因为下次getline会覆盖有效部分)。 - 调整循环逻辑,从
i=0开始,避免初始的空行读取。 - 删除未初始化的
CleanChar变量,消除未定义行为。 - 合并冗余的cout输出语句,简化代码结构。
内容的提问来源于stack exchange,提问作者Fran gwa
相关产品推荐
相关产品推荐

