探索getchar()函数

时间:2019-03-01 13:49:15

标签: c c99 c89

我对C感兴趣,所以我想在C上特别是C89上做更多的探索,以了解这种语言随着时间的推移是如何变化的。我买了Denis Ritchie的“ The C programming language”(第二版)。

书中的一个示例使我对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'字符有关的任何内容

3 个答案:

答案 0 :(得分:2)

  • 您键入//Read id $file = fopen("myfile", "r"); fscanf($file, "%u", $id); fclose($file); //Write new id $file = fopen("myfile", "w"); fprintf($file, "%u", $id + 1); fclose($file); ,然后按Enter。然后,stdin缓冲区将看起来像aa,两个字符。
  • 循环的第一圈\n的值为c,不等于'a',输出0。
  • 循环的下一圈'\n'的值为c,等于'\n',输出1。
  • 在输入结束时,'\n'变为c时,EOF永远不会执行。

答案 1 :(得分:1)

输入a后,按Enter键。

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

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

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

答案 2 :(得分: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',然后读取...。(无论您键入什么下一个)