while循环控制流执行顺序解析及C语言单词直方图代码疑问
循环控制流解析与问题定位
首先根据你的描述,还原代码核心条件分支逻辑(对应你的条件编号):
- 条件1:读取到分隔符(如
\n)且当前处于IN(单词内)状态 → 将状态设为OUT(单词外),但不存储当前单词长度 - 条件2:读取到非分隔符(如
A)且当前处于OUT状态 → 初始化当前单词长度为1,状态设为IN - 条件3:读取到非分隔符且当前处于IN状态 → 累加当前单词长度(你描述中“读取最后一个
\n触发条件3”应为笔误,\n是分隔符,不可能触发长度累加分支) - 条件4:读取到非分隔符且当前处于OUT状态 → 先将上一个单词的长度存入
maxlengths数组,再初始化新单词长度为1,状态设为IN(你的代码逻辑是用下一个单词的起始触发上一个单词的存储)
针对输入序列A\nA\nEOF的逐字符执行流程:
- 读取第一个
A:非分隔符+状态OUT → 触发条件2,当前单词长度length=1,状态转为IN。此时第一个单词长度未存入数组。 - 读取第一个
\n:分隔符+状态IN → 触发条件1,状态转为OUT。length仍为1,未存入数组。 - 读取第二个
A:非分隔符+状态OUT → 触发条件4,将第一个单词的length=1存入maxlengths数组,随后初始化新单词length=1,状态转为IN。此时第一个单词已存储,第二个单词长度为1。 - 读取第二个
\n:分隔符+状态IN → 触发条件1,状态转为OUT。length仍为1,未存入数组。 - 读取EOF:退出while循环。此时第二个单词的长度仍在
length变量中,但代码未处理“循环结束时,最后一个单词未完成存储”的场景,导致第二个单词长度没有存入maxlengths数组。
问题解决
你的代码缺少循环结束后的收尾逻辑:当输入以分隔符+EOF结尾时,最后一个单词的长度未被存入数组。需要在while循环结束后添加判断,补存最后一个单词的长度:
// 循环结束后添加 if (state == IN) { maxlengths[count++] = length; }
如果你的逻辑依赖“下一个单词触发上一个存储”,也可以直接判断长度是否非零来补存:
if (length > 0) { maxlengths[count++] = length; }
内容的提问来源于stack exchange,提问作者user20893826
相关产品推荐
相关产品推荐

