【问题标题】:K&R exercise 1-9. Putchar and getcharK&R 练习 1-9。 Putchar 和 getchar
【发布时间】:2016-01-19 22:18:09
【问题描述】:

我正在做这本书的练习 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:对不起我的英语,如果你有什么不明白的地方,请告诉我。

【问题讨论】:

  • 首先要做的是正确缩进你的代码。 while 循环内的语句应该比while 行缩进更多,依此类推。这将使您更容易在您的脑海中遵循程序的流程。你不应该在同一缩进级别有两个连续的}
  • while (c == ' '){ c = getchar(); } : 循环中断时,需要ungetc(c, stdin)
  • 它可能会帮助您拿起笔和纸,思考c 发生了什么以及您打印到输出的内容。在您的情况下,问题是您忽略了在内部 while 循环中读取的 c 的最后一个值。
  • 看代码就行了。当 'while (c == ' ')' 失败时会发生什么?
  • 好吧,按照逻辑。当你有一个空格后跟一个非空格时会发生什么?你跳过空格,直到你读到非空格字符,然后你打印一个空格,然后你继续下一个循环迭代,你读一个新字符,丢弃你之前读过的非空格。所以在打印完空格后,你需要对下一个字符做一些事情。您可以使用ungetc 将其放回输入流中。这是解决问题的一种方法。

标签: c getchar putchar


【解决方案1】:

在这个 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 )

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 它应该是if ( c != EOF ) putchar(c);,以防文件在一些空间后结束
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      相关资源
      最近更新 更多