C++字符串重复字符查找程序输出乱码,求错误排查与解决方案
C++重复字符查找程序的错误排查与修复方案
程序中的核心错误点
- 未初始化变量:
i、j、m在使用前未赋值,属于未定义行为。比如计算字符串长度的循环里,i初始为随机值,会越界访问字符串内存;j初始值未知,导致malloc分配的内存大小错误。 - 数组
a未添加终止符:用malloc分配的字符数组a没有手动添加'\0',后续while(a[i]!='\0')会持续读取内存中的随机数据,引发乱码。 - 字符存在性判断逻辑错误:内层循环中,只要当前字符和
a[k]不匹配就执行l++,即使前面已有匹配字符,l依然会累加,最终l+1==i的判断失效,无法正确统计新出现的字符。 - 输出循环逻辑错误:
while(a[i]!='\0')里先执行i++再输出a[i],会跳过第一个字符;同时因为a没有终止符,会持续输出内存垃圾数据。 - C++与C内存分配混用:在C程序中使用
malloc不够安全,建议使用C标准容器或new/delete。
修复后的代码
#include <iostream> #include <vector> using namespace std; int main() { string s; int i, k, n = 0; cout << "Enter a string: "; cin >> s; int len = s.size(); // 直接用string的size()获取长度,安全可靠 vector<char> a; // 用vector自动管理内存,无需手动分配释放 vector<int> b; for (i = 0; i < len; i++) { bool exists = false; for (k = 0; k < a.size(); k++) { if (s[i] == a[k]) { b[k]++; exists = true; break; // 找到匹配后直接退出循环,提升效率 } } if (!exists) { a.push_back(s[i]); b.push_back(1); n++; } } // 输出重复字符及次数 for (i = 0; i < a.size(); i++) { if (b[i] > 1) { cout << a[i] << " occurs " << b[i] << " times" << endl; } } return 0; }
修复说明
- 用
string::size()直接获取字符串长度,避免手动遍历导致的越界问题。 - 替换
malloc为C++的vector,自动管理内存,无需手动处理终止符和内存释放。 - 优化字符存在性判断逻辑:用
bool变量标记是否已存在,找到匹配后立即退出内层循环,逻辑更清晰且效率更高。 - 修正输出逻辑:直接遍历
vector的大小,避免依赖终止符,彻底解决乱码问题。
内容的提问来源于stack exchange,提问作者vikas sharma
相关产品推荐
相关产品推荐

