使用fgets()检测EOF,其中filesteam是stdin

一点背景,我正在编写一个程序,它在linux命令行中运行游戏“盒子”并用C语言编写。有一个等待用户输入的提示,然后用fgets()读取并解释等。

作为任务规范的一部分,如果我在等待用户输入时达到“文件结束”,则必须返回特定错误。 我知道fgets()在达到EOF时会返回null …但是我说

fgets(input,max_buffer,stdin);

在提示循环中如果用户提前退出用CTRL + C或CTRL + D说这是否意味着输入== NULL?

我甚至可以检测用户何时使用fgets执行此操作?

只是想试试这个问题,提前感谢任何帮助。

(OS:UNIX)(编译:gcc – c90)

从这里 , fgets

从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾,以先发生者为准。

换行符使fgets停止读取,但它被函数视为有效字符,并包含在复制到str的字符串中。

复制到str后的字符后会自动附加终止空字符。

因此,当用户输入CTRL-D(EOF) 遇到\n (换行符)时, fgets将返回。 CTRL-C 默认会完全终止你的程序。

如果你想抓住CTRL-C并优雅地退出,你可以:

 #include  void intHandler(int dummy) { //graceful CTRL-C exit code. } int main(void) { signal(SIGINT, intHandler); //your code } 

文件(C99§7.19.7.2):

如果成功,fgets函数返回s 。 如果遇到文件结尾且没有字符读入数组,则数组的内容保持不变,并返回空指针。 如果在操作期间发生读取错误,则数组内容是不确定的,并返回空指针。

因此,如果文件结束,但已读取字符,则fgets不会返回NULL 。 如果在读取任何输入之前发生EOF,它将返回NULL

您可以使用feofferrorfunction区分EOF和读取错误。

当最终用户使用Ctrl + C永久退出时,您的程序会立即失去控制权,这意味着您不会从fgets获得任何进一步的输入,甚至不能获得NULL。

另一方面,Ctrl + D关闭输入流而不关闭程序,因此您将从fgets调用中获得NULL结果。

您可以通过处理信号来设置程序以处理Ctrl + C,但这样的处理将在输入循环之外发生。