c-为什么要使用两个getchar()函数



我正在尝试编写一个程序,其任务是清除文本流中多余的空白。

#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 == ' ');
}
}

事实上,我发现这两种选择都比原来的更清晰。最初的声明似乎尽量减少了声明的变量数量。

最新更新