C语言:实现统计字符串最频繁字符出现次数的函数求助
解决字符串中出现次数最多字符的计数问题
嘿,我来帮你排查这段代码的问题,然后给你正确的实现方案。先看看你现有代码里的几个关键错误:
- 变量名拼写错误:
lenght应该是length,虽然编译器可能不会报错,但这是不规范的编程习惯,容易引发后续混淆。 - 核心逻辑完全错误:
if(string[i]==string[i++])这个判断完全偏离需求。首先i++会让循环变量i在每次判断时自动加1,导致循环跳过大量字符;其次这个判断只是比较当前字符和下一个字符是否相同,根本不是统计某个字符在整个字符串中的总出现次数。 - 统计逻辑缺失:你没有针对每个字符去遍历整个字符串统计它的出现次数,只是在相邻字符相同时增加
x,这只能统计连续相同字符的长度,而非某个字符的全局出现次数——比如"eleven"里的'e'出现3次但并不连续,你的代码完全无法统计到。
正确实现方案(高效版)
我们可以利用ASCII字符的范围(0-127),用一个数组来统计每个字符的出现次数,这种方法时间复杂度为O(n),效率很高:
#include <string.h> // 必须包含strlen的头文件 int most_frequent(char *string){ // 初始化计数数组,所有元素默认值为0 int count[128] = {0}; int max_count = 0; int len = strlen(string); // 遍历字符串,统计每个字符的出现次数 for(int i = 0; i < len; i++){ // 将字符转为unsigned char避免ASCII值为负的情况(如扩展ASCII) count[(unsigned char)string[i]]++; } // 遍历计数数组,找到最大的出现次数 for(int i = 0; i < 128; i++){ if(count[i] > max_count){ max_count = count[i]; } } return max_count; }
基础理解版(双重循环)
如果你想更直观地理解统计逻辑,可以用双重循环实现,虽然时间复杂度为O(n²),但适合初学者理解核心思路:
#include <string.h> int most_frequent(char *string){ int max_count = 0; int len = strlen(string); // 外层循环遍历每个字符 for(int i = 0; i < len; i++){ int current_count = 0; // 内层循环遍历整个字符串,统计当前字符的出现次数 for(int j = 0; j < len; j++){ if(string[i] == string[j]){ current_count++; } } // 更新最大次数 if(current_count > max_count){ max_count = current_count; } } return max_count; }
验证示例
- 输入
"overflow":字符'o'出现2次,其他字符均为1次,函数返回2,符合预期。 - 输入
"eleven":字符'e'出现3次,其他字符最多1次,函数返回3,符合预期。
内容的提问来源于stack exchange,提问作者Slavomir Zhirinovsky88
相关产品推荐
相关产品推荐

