【问题标题】:K&R 1-9 // using getchar in a loop inside a loopK&R 1-9 // 在循环中使用 getchar
【发布时间】:2015-01-29 09:02:39
【问题描述】:

我有这个简单的程序:

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,如果非空白字符是EOF,整个程序将中断。

是否需要对EOF 进行第二次检查?会不会被“发现” 第一个循环的条件?

为什么blank 字符会被第二个循环“消耗”,但第一个非空白字符仍然存在以便读取第一个getchar

【问题讨论】:

  • 例如,如果我输入字符串“this example”,外循环中的getchar会读取第一个空格,然后内循环中的getchar会读取一个空格和字母“e”,那么一旦内部循环中断,为什么字母“e”也会被另一个getchar读取?
  • 在对需要中断的答案进行推理之后,我猜外部循环上的 putchar 输出了内部循环中 getchar 读取的字符...
  • 同意第二条评论。

标签: while-loop eof getchar kernighan-and-ritchie


【解决方案1】:

好的,

内心

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.
    }
}

【讨论】:

  • @maja,好吧,这是一个风格和主观的问题,但我认为它更容易看到流程。
  • 你写的第二件事是启动程序,练习(我正在按照教科书)是让程序输出只有一个空格,用于输入中的任何连续空白字符串。跨度>
  • 请注意,内部循环的 getchar 后面跟着一个 ; ,这样就可以跳过任何“额外”的空格,直到找到不同的字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多