我目前正在阅读Ritchie&撰写的C Programming Language一书。 Kernighan的。我对getchar()
函数中EOF的使用感到非常困惑。
首先,我想知道为什么EOF的值为-1,为什么getchar()!=EOF
的值为0.请原谅我的问题,但我真的不明白。我真的尝试过,但我做不到。
然后我尝试在书上运行可以使用下面的代码计算字符数的例子,但是即使我按下输入,我似乎永远不会离开循环所以我想知道我何时会到达EOF ?
main(){
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
然后,我在Problem with EOF in C读了同样的问题。大多数人建议不要使用EOF,而是使用终结符\ n或空终止符'\ 0',这很有意义。
这是否意味着书上的例子有另一个目的?
答案 0 :(得分:76)
EOF表示“文件结束”。换行符(当您按Enter键时会发生这种情况)不是文件的结尾,它是行的结尾,因此换行符不会终止此行循环。
代码没有错[*],它只是没有做你想象的那样。它读到输入的末尾,但你似乎只想读到一行的末尾。
EOF的值为-1,因为它必须与来自getchar
的任何实际字符的返回值不同。因此getchar
将任何字符值作为unsigned char返回,转换为int,因此将为非负数。
如果您在终端上键入内容并且想要激发文件结尾,请使用CTRL-D(unix样式系统)或CTRL-Z(Windows)。然后在读完所有输入后,getchar()
将返回EOF
,因此getchar() != EOF
将为false,循环将终止。
[*]好吧,如果由于整数溢出导致输入超过LONG_MAX个字符,则它具有未定义的行为,但我们可以在一个简单的例子中原谅这一点。
答案 1 :(得分:16)
EOF是-1,因为它是如何定义的。该名称由您#include
的标准库标题提供。它们使它等于-1,因为它必须是不能被getchar()
读取的实际字节错误的东西。 getchar()
使用正数(0到255(含))报告实际字节的值,因此-1可以正常工作。
!=
运算符表示“不相等”。 0代表虚假,其他任何代表都是真的。所以会发生什么,我们称之为getchar()
函数,并将结果与-1(EOF)进行比较。如果结果不等于EOF,则结果为真,因为不相等的事物不相等。如果结果等于EOF,则结果为false,因为相等的事物不是(不相等)。
当您到达“文件结尾”时,对getchar()
的调用会返回EOF。就C而言,“标准输入”(通过在命令窗口中键入给您的程序的数据)就像一个文件。当然,你总是可以输入更多,所以你需要一种明确的方式来说“我已经完成了”。在Windows系统上,这是control-Z。在Unix系统上,这是control-D。
书中的例子并非“错误”。这取决于你真正想做的事情。阅读直到EOF意味着你阅读所有内容,直到用户说“我已经完成”,然后你再也看不懂了。读到'\ n'表示你读了一行输入。如果您希望用户输入输入,则读到“\ 0”是一个坏主意,因为在命令提示符处使用键盘生成此字节要么很难或不可能:)
答案 2 :(得分:7)
这是很多问题。
为什么EOF
为-1:POSIX系统调用中的-1通常会出错,因此我猜这个想法是“EOF是一种错误”
任何布尔运算(包括!=)如果为TRUE则返回1,如果为FALSE则返回0,因此当getchar() != EOF
为FALSE时0
为getchar()
,这意味着EOF
已退回EOF
。
为了在stdin
阅读时模拟{{1}}按 Ctrl + D