新手求助:排查统计单词长度频率的C程序错误
你的C程序错误分析及修正方案
1. 数组越界初始化问题
你定义的lenCount是长度为20的数组,合法索引范围是0~19,但初始化循环写的是for(i=0; i<=20; i++),这会非法访问lenCount[20],触发未定义行为。
修正:把循环条件改为i < 20(或i <=19)。
2. 括号优先级错误
while((c=getchar()!=EOF))的括号位置错误,!=优先级高于=,实际执行逻辑是c = (getchar() != EOF),导致c的值只会是0或1,而非输入字符的ASCII值。
修正:调整括号位置为while( (c = getchar()) != EOF )。
3. 单词计数逻辑漏洞
- 连续输入空白字符(比如多个空格)时,会重复统计“长度为0的单词”,不符合统计需求;
- 输入结束(触发EOF)时,最后一个单词无法被统计,因为没有触发空白字符的计数逻辑;
- 定义了
state变量但未使用,可用来标记当前是否处于单词中,避免重复计数。
修正思路:
- 初始化
state=0(0表示不在单词中,1表示在单词中); - 遇到非空白字符时:若
state为0,说明刚进入单词,将i设为1并把state改为1;若state为1,就让i自增; - 遇到空白字符时:若
state为1,说明刚结束一个单词,统计该长度的单词,再把state设为0、i重置为0; - 循环结束后,额外检查
state是否为1,若是则统计最后一个未处理的单词。
4. 超长单词的越界问题
如果输入的单词长度超过19,会导致lenCount数组越界。
修正:可以把数组定义为lenCount[21](对应0~20长度的单词),或者在i自增时限制最大值为20。
修正后的完整代码
#include <stdio.h> int main() { int lenCount[21] = {0}; // 数组长度设为21,覆盖0~20长度的单词 int i = 0, c, state = 0; printf("Enter the words:\n"); while( (c = getchar()) != EOF ) { if(c == '\n' || c == ' ' || c == '\t'){ if(state == 1){ if(i <= 20){ lenCount[i]++; } state = 0; i = 0; } } else { if(state == 0){ i = 1; state = 1; } else { if(i < 20){ ++i; } } } } // 处理输入结束时未统计的最后一个单词 if(state == 1){ if(i <=20){ lenCount[i]++; } } for(i=1; i<=20; i++){ // 从1开始,跳过无意义的0长度单词统计 printf("\n%d个字母的单词出现了%d次", i, lenCount[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Daksh
相关产品推荐
相关产品推荐

