K&R 1-9 // 在循环中的循环中使用 getchar

K&R 1-9 // using getchar in a loop inside a loop

我有这个简单的程序:

main()
{
    int c;
    while ((c = getchar()) != EOF)
    {
        if (c == ' ')
        {
            while ((c = getchar()) == ' ');
            putchar(' ');

            if (c == EOF) break;
        }

        putchar(c);
    }
}

据我了解,有两个循环。第一个循环的条件是 getchar 的输出与 EOF 不同(因此隐含地循环在 EOF 处中断);第二个循环的条件是 getchar 的输出不是 blank,那么它将恰好输出一个 blank,如果非空白字符是 [=12] =] 整个程序会中断。

是否有必要对 EOF 进行第二次检查?不会是"spotted" 第一个循环的条件?

为什么 blank 个字符会在第二个循环中变成 "consumed",但第一个非空白字符仍然存在以便第一个 getchar 被读取?

好的,

内层

if (c == EOF) break;

避免后续

putchar(c);

如果循环的那个循环完成,将执行其他操作。


例如

main()
{
    int c;
    while ((c = getchar()) != EOF)
    {
        if (c == ' ')
        {
            while ((c = getchar()) == ' ');
            putchar(' ');
            if (c == EOF) break; // <<- This ...
        }

        putchar(c);             // <<- ... jumps past this.
    }
}