请求解析K&R习题1-9:多空格转单空格C语言代码的工作原理
K&R习题1-9代码工作机制解析
这段C代码实现了将输入内容复制到输出,并把一个或多个连续空格替换为单个空格的功能,完全符合K&R《C程序设计语言》习题1-9的要求,下面拆解它的工作逻辑:
基础准备
#include <stdio.h>:引入标准输入输出库,为getchar()(读取字符)和putchar()(输出字符)提供支持。int c, prevchar;:定义两个整数变量:c:存储当前读取的字符(用int而非char是因为要容纳EOF——文件结束标志,其值通常为-1,超出了char的范围)。prevchar:存储上一次读取的字符,用来对比当前字符是否属于连续空格。
核心循环逻辑
while ((c = getchar()) != EOF):这是整个程序的主循环,每次从标准输入读取一个字符到c,直到遇到EOF(比如输入时按Ctrl+D或Ctrl+Z)才终止循环。这里的括号必须加,因为赋值运算符=的优先级低于不等于运算符!=,加括号能保证先完成字符读取赋值,再判断是否到达输入末尾。
字符输出判断
if (c != prevchar || prevchar != ' '):这个条件决定是否输出当前字符c,可以拆成两种场景理解:
- 当上一个字符
prevchar不是空格时:不管当前字符是空格还是非空格,都会输出c。比如上一个字符是字母,当前是空格,这是第一个空格,需要保留;当前是字母,直接输出即可。 - 当上一个字符
prevchar是空格时:只有当前字符c不是空格时,才会输出c。如果当前字符也是空格,c == prevchar且prevchar == ' ',条件不成立,不会输出这个重复的空格,从而实现连续空格只保留一个的效果。
每次判断完成后,prevchar = c;会把当前字符赋值给prevchar,作为下一次循环的“历史字符”,实现连续字符的对比。
小提示:代码里
prevchar没有初始化,不过实际运行时不会影响功能——如果第一个字符是空格,初始的prevchar不是空格,所以第一个空格会被正常输出;如果第一个字符是非空格,直接输出即可。严格来说给prevchar赋个初始值(比如prevchar = '\0';)会更规范,但不影响现有功能。
内容的提问来源于stack exchange,提问作者Ayush Kumar
相关产品推荐
相关产品推荐

