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

新手求助:排查统计单词长度频率的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:20:27