0

我正在做这本书的练习 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)nowhey ow. 总是删除最后一个空格后的第一个字母。我认为这是一个非常愚蠢的错误,但我不知道如何修复它。我会很感激任何建议。PS:对不起我的英语,如果你不明白,请告诉我。

4

3 回答 3

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 )
于 2016-01-19T22:41:28.747 回答
0

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

于 2016-01-19T22:23:15.330 回答
0

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

于 2016-01-19T22:23:32.667 回答