C 为什么EOF(文件结尾)不是';t在没有'\n';在它之前?

C 为什么EOF(文件结尾)不是';t在没有'\n';在它之前?,c,input,eof,C,Input,Eof,所以我开始用ANSIC手册学习C。本书的早期练习之一是编写一个程序,该程序接受文本输入,并将每个单词打印在一行新行上,非常简单。所以我做了: #include <stdio.h> #define IN 1 #define OUT 0 main() { int c; int state; state = OUT; while((c = getchar()) != EOF){ if(c != ' ' && c

所以我开始用ANSIC手册学习C。本书的早期练习之一是编写一个程序,该程序接受文本输入,并将每个单词打印在一行新行上,非常简单。所以我做了:

#include <stdio.h>

#define IN 1
#define OUT 0

 main() { 

    int c;
    int state;

    state = OUT;

    while((c = getchar()) != EOF){
        if(c != ' ' && c != '\n' && c != '\t'){
            state = IN;
        }else if(state == IN){
            state = OUT;
            putchar('\n');
        }
        if(state == IN)
            putchar(c);
    }

     getchar();
 }
#包括
#在1中定义
#定义出0
main(){
INTC;
int状态;
状态=输出;
而((c=getchar())!=EOF){
如果(c!=''&&c!='\n'&&c!='\t'){
状态=IN;
}else if(state==IN){
状态=输出;
putchar('\n');
}
如果(状态==IN)
普查尔(c);
}
getchar();
}
<> P>这是,当程序运行良好时,如果我输入<代码> EOF(Ctrl +z在Windows上),作为一个行的最后一个字符或在中间,它不会中断while循环。p> 所以我找到了答案


我学到的是,(Ctrl+Z)字符是结束流的某种信号,它必须位于新行上,才能返回
EOF
。虽然这一切都很好,而且有点帮助,但我真的想知道为什么
EOF
必须在自己的行上?

您遇到的问题与您的命令行终端有关,与文件结束标记本身无关。大多数终端不会在您键入字符时向程序发送字符,而是等到您完成一整行后再向程序发送您键入的字符

您可以通过让输入来自文本文件而不是手动键入来测试这一点。您应该能够在没有换行的情况下结束输入文件,而不会出现任何问题

./myprogram.exe < input.txt
/myprogram.exe


顺便说一句,您链接到的答案还指出EOF不是输入流中实际存在的字符,因此它不可能出现在“a”\n之前。EOF只是当没有字符可读取时,
getchar
返回的值。

当从tty设备(例如控制台或终端窗口中运行的程序的stdin)读取时,终端处于所谓的状态。在此模式下,提供了某种级别的行编辑功能,允许用户退格并更改键入的内容

在按下return键之前,键入的字符不会返回到程序中


可以通过将终端置于“原始”模式来实现这一点。不幸的是,这似乎并没有很好的标准化,所以它有点特定于系统。答案中有一些针对各种平台的示例。

请参见此答案。几周前,我们有一个类似的问题,我找不到任何相关参考资料。但据我所知,对于大多数类似UNIX的终端,
^D
会刷新输入缓冲区,如果刷新,则发送EOF;换行符也会刷新缓冲区。也许Windows也是如此(使用
^Z
而不是
^D
)?另外请注意,上一个
getchar()
永远无法读取任何内容(当您退出循环时,最后一个
getchar
调用返回了
EOF
。@mafso最后一个
getchar()
是用来保持控制台打开的,除此之外什么都没有。这是有效的(只是出于好奇,我不熟悉Windows控制台)是的,我知道
EOF
不是字符,但我没有得到的是,为什么我不能在一行的末尾使用(Ctrl+Z)ti signal
getchar()
返回
EOF
,你的回答让我从现在起就可以放松下来,继续读这本书,而不会因为这个问题而伤脑筋!非常感谢。