探索 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'
然后读取....(无论你接下来输入)
我对 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'
然后读取....(无论你接下来输入)