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

C++无法正确终止cstring导致字符频率统计输出乱码问题求解

问题根因

  • 你在getMaxCharfrequ函数第一行写了arr[0] = '\0',直接把输入字符串的首字符覆盖为空,完全破坏了原始输入数据,这是优先级最高的错误。
  • 你向统计函数传入的是数组的总容量15,而不是用户实际输入的字符串长度,导致循环会遍历到数组中未被输入填充的未初始化内存区域。Windows下VS编译的程序调试时栈内存默认填充值为0xCC,对应的字符就是你看到的乱码╠,这部分无意义的内存数据被纳入统计自然会输出乱码。
  • 你插入终止符的逻辑完全错误:终止符应该加在输入字符串的末尾,而不是数组开头,且只要有终止符就可以用来判断字符串结束位置,不需要用数组总容量来遍历。

修正方案

  1. 删掉getMaxCharfrequ函数开头的arr[0] = '\0'多余错误代码
  2. 统计逻辑改为仅遍历到字符串终止符'\0'为止,或者传入strlen(arr)获取的实际输入长度作为遍历上限
  3. 补充<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:09:03