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

为何在去除文本流多余空格的C程序中使用两次getchar()函数?

为什么第二个while循环中要再次给c赋值getchar()?

这个程序的核心逻辑是把文本中连续的多个空格替换成单个空格,第二个while循环里的c = getchar()有两个关键作用:

1. 跳过所有连续的多余空格

当外层循环读到第一个空格时,我们先输出这个空格(保留一个),接着需要跳过后面所有紧跟着的空格。这时候第二个while循环会不断调用getchar()读取下一个字符,只要读出来的是空格,就继续循环——相当于把这些多余的空格直接丢弃,不输出。

2. 保存第一个非空格字符,避免丢失

当第二个while循环跳出时,说明我们读到了第一个非空格的字符(或者EOF)。如果不在循环里把这个字符赋值给c,这个字符就会被getchar()读出来但没被存储,外层循环的下一次迭代又会读取新的字符,导致这个非空格字符直接丢失,不会被输出。

举个实际的例子:假设输入是"test case"(三个空格分隔)

  • 外层循环读到第一个空格,先输出它;
  • 第二个while循环开始读第二个空格(是空格,继续)、第三个空格(还是空格,继续),然后读到字符'c';
  • 这时候c = 'c',循环跳出,后面的putchar(c)就会输出'c',不会漏掉这个字符。

如果把第二个循环写成while(getchar() == ' '),那读到的'c'就没被存到c里,程序就不会输出它,最终结果会变成"test ase",这显然是错误的。

另外,循环里的if(c == EOF) break;是为了处理读到文件末尾的情况:如果第二个while循环读到了EOF,就直接跳出外层循环,避免后面的putchar(c)尝试输出EOF(这不是可打印字符,会导致异常)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:25:17