ctrl-d没有停止while(getchar()!= EOF)循环

Sam*_*Sam 9 c unix eof

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

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);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Lin 12

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

有关更好的说明,请参阅C faqstdio部分.

另外:

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

  • 当终端处于规范模式时,直到您按Enter键才会通过tty设备传输线路.按下配置的EOF键(默认为^ D)会立即传输数据,并且等待它的任何"读取"返回可用的字符数.如果该行已有数据,则这将是正常的非零长度读取.如果该行为空,则将导致零长度读取,这是文件描述符上文件结束状态的*定义*.因此stdio层将其解释为EOF状态. (6认同)
  • @qingfeng这里有更多关于`^ D`的内容:http://www.c-faq.com/stdio/eofval.html但是,除非它本身就在线上,否则流不会被关闭.这里简短说明:http://stackoverflow.com/a/1516177/851273 (2认同)

jxh*_*jxh 6

除了Jon Lin关于EOF的答案,我不确定你写的代码是你的意图.如果要查看getchar变量中返回的值d,则需要将while语句更改为:

    while((d=getchar())!=EOF) {
Run Code Online (Sandbox Code Playgroud)

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