2

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

4

3 回答 3

2
  • 您键入a并按回车键。标准输入缓冲区将看起来像a, \n, 两个字符。
  • 循环中的第一圈,c值为'a',不等于'\n',输出 0。
  • 循环中的下一圈,c值为'\n',等于'\n',输出 1。
  • 在输入结束时c变为时EOFprintf永远不会执行。
于 2019-03-01T13:54:53.070 回答
1

输入后按回车a

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

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

将读取直到到达EOF,因此它将先读取 a然后\n(输入)。

于 2019-03-01T13:51:42.067 回答
0

以你的第二个例子,即

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

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

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

于 2019-03-01T14:01:46.723 回答