为何处理连续空格时,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语句(这步属于冗余操作,但代码逻辑如此)。
具体执行流程拆解:
- 处理完
Hoang后,length=5,state=IN。 - 遇到第一个空格:
- 将
state设为OUT - 更新
max为5 - 因
length=5≠0,执行count[5]++ - 将
length置为0
- 将
- 遇到第二个空格:
- 进入空格分支,
state设为OUT(无实际变化,本来就是OUT) length=0,if (length > max)不触发length=0,if (length !=0)不成立,跳过count[length]++- 执行
length=0(冗余操作)
- 进入空格分支,
- 第三个空格的处理和第二个完全一致,直到遇到
D时,才会将state重新设为IN,length开始累加。
简言之,连续空白字符中,只有第一个会触发count的更新(此时length还保留着上一个单词的长度),后续空白字符因length已被置0,不会再执行count累加操作——这是代码逻辑的设计意图:把连续空白视为同一个单词分隔符,只在单词结束时统计一次长度。
内容的提问来源于stack exchange,提问作者NameBlue
相关产品推荐
相关产品推荐

