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
相关产品推荐
相关产品推荐

