我对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'字符有关的任何内容
答案 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缓冲区将看起来像a
,a
,两个字符。\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'
,然后读取...。(无论您键入什么下一个)