C++无法正确终止cstring导致字符频率统计输出乱码问题求解
问题根因
- 你在
getMaxCharfrequ函数第一行写了arr[0] = '\0',直接把输入字符串的首字符覆盖为空,完全破坏了原始输入数据,这是优先级最高的错误。 - 你向统计函数传入的是数组的总容量15,而不是用户实际输入的字符串长度,导致循环会遍历到数组中未被输入填充的未初始化内存区域。Windows下VS编译的程序调试时栈内存默认填充值为0xCC,对应的字符就是你看到的乱码
╠,这部分无意义的内存数据被纳入统计自然会输出乱码。 - 你插入终止符的逻辑完全错误:终止符应该加在输入字符串的末尾,而不是数组开头,且只要有终止符就可以用来判断字符串结束位置,不需要用数组总容量来遍历。
修正方案
- 删掉
getMaxCharfrequ函数开头的arr[0] = '\0'多余错误代码 - 统计逻辑改为仅遍历到字符串终止符
'\0'为止,或者传入strlen(arr)获取的实际输入长度作为遍历上限 - 补充
<cstring>头文件用于调用strlen,把非标准的void main改为标准的int main写法
修正后完整代码
#include <iostream> #include <cstring> using namespace std; // 第二个参数改为传入实际字符串长度 void getMaxCharfrequ(char arr[], int actualLen) { char maxChar = ' '; int maxfreq = 0; for (int i = 0; i < actualLen; i++) { int count = 1; for (int j = i + 1; j < actualLen; j++) if (arr[i] == arr[j]) count++; if (count > maxfreq) maxfreq = count; } for (int i = 0; i < actualLen; i++) { int count = 1; for (int j = i + 1; j < actualLen; j++) if (arr[i] == arr[j]) count++; if (count == maxfreq) maxChar = arr[i]; } cout << "出现频率最高的字符是 " << maxChar << " ,出现次数为 " << maxfreq; } #define ARR_SIZE 15 int main() { char arr[ARR_SIZE]; cout << "请输入字符串:"; cin >> arr; // 传入实际输入的字符串长度 getMaxCharfrequ(arr, strlen(arr)); return 0; }
内容的提问来源于stack exchange,提问作者Core
相关产品推荐
相关产品推荐

