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

请求解析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,可以拆成两种场景理解:

  1. 当上一个字符prevchar不是空格时:不管当前字符是空格还是非空格,都会输出c。比如上一个字符是字母,当前是空格,这是第一个空格,需要保留;当前是字母,直接输出即可。
  2. 当上一个字符prevchar是空格时:只有当前字符c不是空格时,才会输出c。如果当前字符也是空格,c == prevchar且prevchar == ' ',条件不成立,不会输出这个重复的空格,从而实现连续空格只保留一个的效果。

每次判断完成后,prevchar = c;会把当前字符赋值给prevchar,作为下一次循环的“历史字符”,实现连续字符的对比。

小提示:代码里prevchar没有初始化,不过实际运行时不会影响功能——如果第一个字符是空格,初始的prevchar不是空格,所以第一个空格会被正常输出;如果第一个字符是非空格,直接输出即可。严格来说给prevchar赋个初始值(比如prevchar = '\0';)会更规范,但不影响现有功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:58:28