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

时间:2016-01-19 22:18:09

标签: c getchar putchar

我正在练习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:对不起我的英语,如果你不明白,请告诉我。

3 个答案:

答案 0 :(得分:2)

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

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

您正在跳过刚刚读取的非空白字符,因为在外部循环中

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 )

答案 1 :(得分:0)

因为while (c == ' ')正在读取,直到找到非空格。所以,当你到达'n'时它会停止,但是你没有放置那个角色。在putchar(' ')之后,添加putchar(c);以在空白字符串后打印字符。

答案 2 :(得分:0)

因为在你得到'n'的内部,然后在外在的条件下,你得到另一个角色,即'o'。