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

while循环控制流执行顺序解析及C语言单词直方图代码疑问

循环控制流解析与问题定位

首先根据你的描述,还原代码核心条件分支逻辑(对应你的条件编号):

  • 条件1:读取到分隔符(如\n)且当前处于IN(单词内)状态 → 将状态设为OUT(单词外),但不存储当前单词长度
  • 条件2:读取到非分隔符(如A)且当前处于OUT状态 → 初始化当前单词长度为1,状态设为IN
  • 条件3:读取到非分隔符且当前处于IN状态 → 累加当前单词长度(你描述中“读取最后一个\n触发条件3”应为笔误,\n是分隔符,不可能触发长度累加分支)
  • 条件4:读取到非分隔符且当前处于OUT状态 → 先将上一个单词的长度存入maxlengths数组,再初始化新单词长度为1,状态设为IN(你的代码逻辑是用下一个单词的起始触发上一个单词的存储)

针对输入序列A\nA\nEOF的逐字符执行流程:

  1. 读取第一个A:非分隔符+状态OUT → 触发条件2,当前单词长度length=1,状态转为IN。此时第一个单词长度未存入数组。
  2. 读取第一个\n:分隔符+状态IN → 触发条件1,状态转为OUT。length仍为1,未存入数组。
  3. 读取第二个A:非分隔符+状态OUT → 触发条件4,将第一个单词的length=1存入maxlengths数组,随后初始化新单词length=1,状态转为IN。此时第一个单词已存储,第二个单词长度为1。
  4. 读取第二个\n:分隔符+状态IN → 触发条件1,状态转为OUT。length仍为1,未存入数组。
  5. 读取EOF:退出while循环。此时第二个单词的长度仍在length变量中,但代码未处理“循环结束时,最后一个单词未完成存储”的场景,导致第二个单词长度没有存入maxlengths数组。
问题解决

你的代码缺少循环结束后的收尾逻辑:当输入以分隔符+EOF结尾时,最后一个单词的长度未被存入数组。需要在while循环结束后添加判断,补存最后一个单词的长度:

// 循环结束后添加
if (state == IN) {
    maxlengths[count++] = length;
}

如果你的逻辑依赖“下一个单词触发上一个存储”,也可以直接判断长度是否非零来补存:

if (length > 0) {
    maxlengths[count++] = length;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:01:10