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

为何处理连续空格时,count[length]++未执行而直接执行length=0语句?

问题

输入内容为Hoang Dung(三个空格分隔),调试时发现第一个空格处state=1、length=0、max=5,想请教为何遇到第二个空格时,count[length]++语句没有被执行,而是直接执行了length=0语句?对应的C语言代码如下:

#define IN  0
#define OUT 1

main()
{
    int state;
    int length, max;
    int count[8];
    int i,  j;
    char c;
    length = 0;
    max = 0;
    state = OUT;

    for (i = 0; i < 8; ++i)
        count[i] = 0;

    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\n' || c == '\t') {
            state = OUT;

            if (length > max)
                max = length;

            if (length != 0)
                count[length]++;

            length = 0;
        } else if (state == OUT) {
            state = IN;
            length++;
        } else {
            length++;
        }
    }

    for (i = 0; i < max + 1; ++i) {
        printf("%2d: ", i);
        for (j = 0; j < count[i];   ++j) {
            putchar('#');
        }
        printf("\n");
    }
}
分析与解答

核心原因是连续空格的处理逻辑:

  • 处理第一个空格时,代码已经将length置为0,同时把state设为OUT。
  • 处理第二个空格时,进入空格判断分支,此时length的值是0,if (length != 0)条件不成立,因此count[length]++不会执行,直接走到length=0语句(这步属于冗余操作,但代码逻辑如此)。

具体执行流程拆解:

  1. 处理完Hoang后,length=5,state=IN。
  2. 遇到第一个空格:
    • 将state设为OUT
    • 更新max为5
    • 因length=5≠0,执行count[5]++
    • 将length置为0
  3. 遇到第二个空格:
    • 进入空格分支,state设为OUT(无实际变化,本来就是OUT)
    • length=0,if (length > max)不触发
    • length=0,if (length !=0)不成立,跳过count[length]++
    • 执行length=0(冗余操作)
  4. 第三个空格的处理和第二个完全一致,直到遇到D时,才会将state重新设为IN,length开始累加。

简言之,连续空白字符中,只有第一个会触发count的更新(此时length还保留着上一个单词的长度),后续空白字符因length已被置0,不会再执行count累加操作——这是代码逻辑的设计意图:把连续空白视为同一个单词分隔符,只在单词结束时统计一次长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:40:36