K&R 练习 1-9。 Putchar 和 getchar

K&R exercise 1-9. Putchar and getchar

我正在做这本书的练习 1-9(编写一个程序将其输入复制到输出,将一个或多个空格的每个字符串替换为一个空格),看来我不太明白它。到目前为止,这是我的代码:

#include <stdio.h>

int main() {
    int c;

    while ((c = getchar()) != EOF)
        if (c == ' ') {
            while (c == ' ') {
                c = getchar();
            }
            putchar(' ');
        } else {
            putchar(c);
        }

    return 0;
}

这是错误的,因为 hey(blank)(blank)(blank)now 这句话变成了 hey ow。始终删除最后一个空白后的第一个字母。我认为这是一个非常愚蠢的错误,但我看不出如何修复它。我会很感激任何建议。 PS: 对不起我的英语,如果你不明白什么,请告诉我。

因为 while (c == ' ') 正在读取直到找到 non-space。因此,当您到达 'n' 时它会停止,但您没有放置该字符。在putchar(' ')之后加一个putchar(c);,打印出一串空格后面的字符。

因为在内部 while 条件中得到 'n' 然后在外部 while 条件中得到另一个字符,即 'o'.

在此if语句中(我已将其格式化为可读)

if (c == ' ')
{
    while (c == ' ')
    {
        c = getchar();
    }
    putchar(' ');
}

您正在跳过刚刚读取的 non-blank 字符,因为在外循环中

while ((c = getchar()) != EOF)

您正在阅读下一个字符。

程序可以写成下面这样的例子

#include <stdio.h>

int main( void )
{
    int blank = 0;
    int c;

    while ( ( c = getchar() ) != EOF )
    {
        if ( !blank || c != ' '  ) putchar( c );
        blank = c == ' ';
    }

    return 0;
}

考虑到根据 C 标准 main 没有参数应该声明为

int main( void )