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

K&R教材习题1-9 多空格合并代码if语句运行逻辑疑问

K&R 习题1-9 代码运行逻辑解析

你提到的代码逻辑如下:

int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            while ((c = getchar()) == ' ');
            putchar(' ');
            if (c == EOF) break;
        }
        putchar(c);
    }
}

核心运行逻辑拆解

  • 外层大循环每次从标准输入读取一个字符,只要没读到EOF(文件结束符)就持续运行
  • 当读取到的字符c不是空格时:
    • 完全不会进入if (c == ' ')的分支
    • 直接执行if分支外的putchar(c),把当前读到的非空格字符直接输出,这就是你输入字母时程序看起来“正常运行”的原因——这个场景下if分支根本没有执行,所有输出逻辑都来自if外的putchar语句
  • 当读取到的字符c是空格时:
    • 进入if分支,首先启动内层while循环,持续读取下一个字符,只要读到的还是空格就一直循环,直到读到非空格字符或者EOF才退出内层循环
    • 退出内层循环后先输出一个单个空格,完成“多个连续空格替换成一个”的需求
    • 检查刚刚退出内层循环时读到的字符是不是EOF,如果是直接跳出外层循环,避免后续无效操作
    • 退出if分支,执行外层的putchar(c),把刚刚读到的非空格字符输出

疑问解答

你的原有理解完全正确:if语句确实只有读到空格时才会执行。你产生“输入字母时if也在运行”的错觉,是因为非空格字符的输出逻辑根本不需要走if分支,不管有没有进入if分支,程序都会执行最后一句putchar(c)(除非遇到EOF提前break)。

可以用实际输入验证逻辑:输入hello world(hello和world之间有3个空格),程序最终输出为hello world,连续3个空格被替换为1个,非空格的字母完全保留,符合习题要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:09:02