有点背景,我正在编写一个播放游戏的程序" box"它在linux命令行中运行,用C语言编写。提示等待用户输入,然后用fgets()读取并解释等。
作为任务规范的一部分,如果在等待用户输入的同时达到"文件结尾,则必须返回特定错误"。我知道fgets()在达到EOF时会返回null ...但是说我有
fgets(input,max_buffer,stdin);
在提示循环中如果用户提前退出用CTRL + C或CTRL + D说这是否意味着输入== NULL?
我甚至可以检测用户何时使用fgets执行此操作?
只是试图了解这一点,提前感谢任何帮助。
(OS:UNIX) (编译:gcc - c90)
答案 0 :(得分:4)
来自here,fgets
:
从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾为止,以先发生者为准。
换行符使fgets停止读取,但它被函数视为有效字符,并包含在复制到str的字符串中。
在复制到str。
的字符后,会自动附加终止空字符
因此,当遇到fgets
(换行符)时,用户输入CTRL-D(文件结束)或时,\n
将返回。 CTRL-C默认情况下 完全终止您的程序。
如果你想抓住CTRL-C并优雅地退出,你可以:
#include <signal.h>
void intHandler(int dummy) {
//graceful CTRL-C exit code.
}
int main(void) {
signal(SIGINT, intHandler);
//your code
}
答案 1 :(得分:2)
文件(C99§7.19.7.2):
如果成功,fgets函数将返回 s 。如果遇到文件结尾且没有字符读入数组,则数组的内容保持不变,并返回空指针。如果在操作期间发生读取错误,则数组内容不确定并返回空指针。
因此,如果文件结束,但已读取字符,fgets
将不会返回NULL
。如果在读取任何输入之前发生了EOF,它将返回NULL
。
答案 2 :(得分:1)
当最终用户使用Ctrl + C永久退出时,您的程序会立即失去控制权,这意味着您不会从fgets获得任何进一步的输入,甚至不会为NULL。
另一方面,Ctrl + D关闭输入流而不关闭程序,因此您将从fgets调用中获得NULL结果。
您可以通过处理信号来设置程序以处理Ctrl + C,但这样的处理将在输入循环之外发生。