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

C语言使用双层for循环统计字符串各字符出现次数问题排查

问题解答

你的双层循环实现思路是可行的,不存在根本性错误,只是代码存在几处细节逻辑错误,导致无法得到正确结果:

  • 计数逻辑错误:你当前将字符串下标i作为计数数组cnt的下标,相当于给字符串的每个位置计数,而非给每个字母计数。26个小写字母仅需要长度为26的数组,用ch - 'a'作为计数下标即可。
  • 输出取值错误:内层循环结束后变量i的值等于字符串长度,你此时输出cnt[i]属于数组越界访问,拿到的是内存中的随机垃圾值。
  • 函数使用风险:gets()函数没有输入长度校验,极易触发数组溢出,已经被C标准废弃,建议改用fgets()读取输入。
  • 长度计算逻辑瑕疵:如果输入字符串末尾没有换行符,strlen(A)-1会漏掉最后一位有效字符,建议先判断末尾字符是否为换行再做裁剪。

修正后可运行代码

#include <stdio.h>
#include <string.h>

int main()
{
    char A[100];
    // 仅统计小写字母,26位数组足够
    int cnt[26] = {0};
    // 改用fgets避免数组溢出
    fgets(A, sizeof(A), stdin);
    int len = strlen(A);
    // 去除fgets读取到的末尾换行符
    if (A[len - 1] == '\n') {
        len--;
    }

    // 双层循环实现逻辑
    for(char ch = 'a'; ch <= 'z'; ch++)
    {
        int cur_cnt = 0;
        for(int i = 0; i < len; i++)
        {
            if(A[i] == ch) {
                cur_cnt++;
            }
        }
        // 仅打印出现过的字符可增加判断if(cur_cnt > 0)
        printf("%c 出现了 %d 次\n", ch, cur_cnt);
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:36:07