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

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;
}

修复说明

  1. 用string::size()直接获取字符串长度,避免手动遍历导致的越界问题。
  2. 替换malloc为C++的vector,自动管理内存,无需手动处理终止符和内存释放。
  3. 优化字符存在性判断逻辑:用bool变量标记是否已存在,找到匹配后立即退出内层循环,逻辑更清晰且效率更高。
  4. 修正输出逻辑:直接遍历vector的大小,避免依赖终止符,彻底解决乱码问题。

内容的提问来源于stack exchange,提问作者vikas sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:55:25