【发布时间】:2018-09-10 23:53:30
【问题描述】:
我知道这个问题之前已经讨论过,但我想确保我理解正确,这个程序发生了什么,以及为什么。在 Dennis Ritchie 的教科书 The C Programming Language 的第 20 页上,我们看到了这个程序:
#include <stdio.h>
int main()
{
int c;
c = getchar();
while(c != EOF){
putchar(c);
c = getchar();
}
return 0;
}
执行时,程序会读取输入的每个字符,并在用户按回车后以相同的顺序将它们打印出来。除非用户手动退出控制台,否则此过程会无限重复。事件顺序如下:
getchar()函数读取键入的第一个字符并将其值分配给c。因为
c是整数类型,所以getchar()传递给c的字符值被提升为它对应的ASCII整数值。现在
c已被初始化为某个整数值,while 循环可以测试该值是否等于文件结尾字符。因为EOF字符具有-1的宏值,并且因为可以键入的所有字符都没有负十进制ASCII 值,所以while 循环的条件将始终为真。一旦程序验证
c != EOF为真,就会调用putchar()函数,输出c中包含的字符值。再次调用
getchar(),因此它读取下一个输入字符并将其值传回while循环的开头。如果用户在执行前只键入一个字符,则程序读取<return>值作为下一个字符并打印一个新行并等待键入下一个输入。
这些远程正确吗?
【问题讨论】:
-
没有“EOF 字符”这样的东西。正如您所指出的,EOF 是整数值 -1,它不同于任何可能的字符值。 getchar() 返回一个 int,它可以是一个字符或 EOF,它会终止程序。如何在控制台上导致“EOF”条件取决于操作系统。当然,如果您的输入是从文件重定向的,那么它会以实际的 EOF 条件自然终止。
-
这就是为什么 c 必须声明为整数而不是字符的原因吗?这样表达式 c != EOF 就可以计算了吗?
-
after the user hits enter的想法与标准输入缓冲有关。它是行缓冲的,用户输入的内容由操作系统存储在缓冲区中,只有在用户输入(或 EOF)后才刷新到程序中。 -
1.是,2.不,3.不,4.是,5.是
-
请注意,在终端,您可以键入一个字符,该字符最终会被解释为表示 EOF。在 Unix 上,通常是 Control-D;在 Windows 上,Control-Z。但是,该字符不是 EOF;它可以出现在文件中并且(至少在 Unix 上)它只是另一个有效字符。在终端上键入时,终端驱动程序使任何等待的输入可用于从终端读取的程序。如果没有数据等待,则表明有 0 个字节可用,这就是触发
getchar()等将其视为 EOF 的原因。当 read 返回 0 时,您在常规文件中到达 EOF。