探索 getchar() 函数

Exploring getchar() function

我对 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' 字符相关的任何内容

您输入 a 后按回车键。

因此您的输入流将包含“a\n”。

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

会一直读到 EOF,因此它会先读 a,然后 \n(输入)。

  • 您键入 a 并按回车键。 stdin 缓冲区将看起来像 a\n,两个字符。
  • 循环第一圈,c的值为'a',不等于'\n',输出0。
  • 循环的下一圈,c的值为'\n',等于'\n',输出1。
  • 在输入结束时,当 c 变为 EOF 时,printf 永远不会执行。

举第二个例子,即

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 调用,而第一个示例只有一个 getchar打电话。

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