为何在去除文本流多余空格的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
相关产品推荐
相关产品推荐

