我正在尝试编写一个程序,其任务是清除文本流中多余的空白。
#include <stdio.h>
int main()
{
int c;
while( (c = getchar()) != EOF)
{
if(c == ' ')
{
putchar(c);
while( (c = getchar()) == ' ' );
if(c == EOF) break;
}
putchar(c);
}
}
我知道getchar()
函数每次迭代都会返回一个新字符,我们将该字符存储在c
变量中,但我不明白为什么我们需要在第二个while循环中再次将c
变量分配给getchar()
。
只要从流中提取空间,内部循环就会循环,从而有效地跳过它们。结果是,如果您有一系列空格,第一个空格将被打印出来,其余的将被丢弃。
即使在那里,你也需要分配给c
(而不是只做while (getchar() == ' ');
之类的事情(,因为你会提取一个不是空格的字符,所以你需要记住在循环后输出它是什么字符。
我知道
getchar()
函数每次迭代都会返回一个新字符我们将字符存储在c
变量中,但我搞不清为什么我们需要在第二时间将c
变量分配给getchar()
再次循环。
变量c
的重用没有特别的后果。一个单独的变量本可以用于内部循环。示例:
#include <stdio.h>
int main()
{
int c;
while( (c = getchar()) != EOF)
{
putchar(c);
if(c == ' ')
{
int c2;
while( (c2 = getchar()) == ' ' );
if (c2 == EOF) break;
putchar(c2);
}
}
}
请注意,需要对putchar()
调用进行重新排列。无论哪种方式,当程序遇到空格运行时,它必须(i(打印一个空格,并且(ii(避免在运行后丢失第一个非空格(如果有的话(。
编写程序时只出现一次对getchar()
的调用也是可能的,但随后需要显式存储更多状态(读取的前一个字符是否为空格(,并用它来决定是否输出每个新读取的字符。例如:
#include <stdio.h>
int main(void) {
int c;
_Bool was_space = 0;
while ((c = getchar()) != EOF) {
if (c != ' ' || !was_space) {
putchar(c);
}
was_space = (c == ' ');
}
}
事实上,我发现这两种选择都比原来的更清晰。最初的声明似乎尽量减少了声明的变量数量。