【问题标题】:Exploring getchar() function探索 getchar() 函数
【发布时间】:2019-03-01 13:49:14
【问题描述】:

我对 C 很感兴趣,所以我想更多地探索 C,尤其是 C89,看看这种语言随着时间的推移是如何变化的 :)。我买了 Denis Ritchie 的《The C programming language》(第 2 版)。

书中的一个例子让我想到了一个关于 getchar() 函数的复杂情况。

示例 1 是我阅读本书后的示例:

#include <stdio.h>

int main()
{
    int c = getchar();
    printf("\'\\n\' character in c: %d\n", c == '\n');
    printf("\'\\n\' character in c: %d\n", c == '\n');
}

示例 1 的输出为:

a
'\n' character in c: 0
'\n' character in c: 0

在这种情况下,输出不会在此输入中显示任何换行符。但是,我尝试的另一个示例是:

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        printf("\'\\n\' character in c: %d\n", c == '\n');
    }
}

代码的输出是:

a
'\n' character in c: 0
'\n' character in c: 1

我不明白为什么第二个示例复制了 printf() 函数,以及它在进入循环时如何读取 '\n' 字符。同时,第一个示例没有显示与 '\n' 字符相关的任何内容

【问题讨论】:

  • 跟输入流有关;第一次调用后 /n 仍留在输入流中。
  • 在第一个代码中,您只检查了两次a,而在第二个代码中,它检查了a,然后是\n
  • 先生。 @Blaze,你能向我解释一下内存在这两种情况下是如何工作的吗?谢谢你
  • Lundin 的回答很好地涵盖了这一点。在第一个示例中它没有检查 \n 的原因是因为您没有告诉它这样做。 int c = getchar();a 转换为c,然后您将检查那个两次。你从来没有读过\n。在第一次打印之后,您可能想要另一个 c = getchar();

标签: c c99 c89


【解决方案1】:
  • 您输入a 并按回车键。然后,标准输入缓冲区将看起来像 a\n,两个字符。
  • 循环中的第一圈,c 的值是 'a',不等于 '\n',输出 0。
  • 循环中的下一圈,c 的值是 '\n',等于 '\n',输出 1。
  • 在输入结束时c 变为EOFprintf 永远不会执行。

【讨论】:

  • 谢谢。但是为什么第一个例子不检查'\n'字符呢?
  • 不是因为你只请求一个字符一次。 getchar() 一次返回一个字符,任何剩余的字符都留在输入流上,以供后续调用 getchar 使用。
【解决方案2】:

输入a后按回车。

因此您的输入流将具有“a\n”。

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

会一直读取到EOF,因此它会先读取a,然后读取\n(回车)。

【讨论】:

    【解决方案3】:

    举第二个例子,即

    while ((c = getchar()) != EOF) {
        printf("\'\\n\' character in c: %d\n", c == '\n');
    }
    

    然后展开循环。它将变成:

    c = getchar();
    if (c == EOF) return 0;
    printf("\'\\n\' character in c: %d\n", c == '\n');
    c = getchar();
    if (c == EOF) return 0;
    printf("\'\\n\' character in c: %d\n", c == '\n');
    c = getchar();
    if (c == EOF) return 0;
    printf("\'\\n\' character in c: %d\n", c == '\n');
    ... and so on ...
    

    现在将此与您的第一个版本进行比较,您会发现不同之处在于第二个示例在printf 之间进行了getchar 调用,而第一个示例只有一个getcharcall。

    换句话说 - 第一个示例只读取字符'a',而第二个示例首先读取'a',然后读取'\n',然后读取....(无论您接下来键入什么)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多