9

这是我的代码。我用终端在 ubuntu 中运行它。当我在终端中键入 (a CtrlD) 时,程序并没有停止,而是继续等待我的输入。

CtrlD等于unix中的EOF吗?

谢谢你。

#include<stdio.h>

main() {
    int d;
    while(d=getchar()!=EOF) {
        printf("\"getchar()!=EOF\" result is %d\n", d);
        printf("EOF:%d\n", EOF);
    }
        printf("\"getchar()!=EOF\" result is %d\n", d);
}
4

2 回答 2

12

EOF 不是字符。EOF是一个宏,当getchar()它到达输入末尾或遇到某种错误时返回。这^D不是“EOF 字符”。当您在一行上单独点击 ^D 时,在 linux 下发生的事情是它关闭了流,并且getchar()调用到达输入的末尾并返回EOF宏。如果您^D在一行中间的某处键入,则流不会关闭,因此getchar()返回它读取的值并且您的循环不会退出。

有关更好的描述,请参阅 C 常见问题的stdio部分。

此外:

在现代系统上,它不反映存储在文件中的任何实际文件结尾字符;这是一个没有更多字符可用的信号。

于 2012-08-14T01:20:46.267 回答
6

除了 Jon Lin 关于 EOF 的回答之外,我不确定您编写的代码是否符合您的意图。如果要查看变量中返回的值getchar,则d需要将while语句更改为:

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

这是因为不等式运算符的优先级高于赋值。因此,在您的代码中,d将始终是0or 1

于 2012-08-14T01:27:19.213 回答