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
相关产品推荐
相关产品推荐

