为什么按下Ctrl+d时调用fgets会导致C语言程序进入无限循环?
异常现象根因说明
你遇到的无限循环问题是标准输入流EOF标志未被处理导致的,具体逻辑如下:
- Ctrl+D在类Unix终端下是EOF(输入流结束)触发快捷键,Windows下对应触发快捷键为Ctrl+Z
- 当EOF被触发时,
fgets()会返回NULL,同时C标准库会自动将stdin流的EOF标志位置为生效状态 - 你的代码中检测到
fgets()返回NULL后,仅打印提示就直接continue进入下一轮循环,没有做任何清除stdinEOF标志的操作 - 下一轮循环调用
fgets()时,函数会优先检测stdin的状态,发现已经处于EOF状态,会直接返回NULL,不会阻塞等待用户输入,由此进入死循环
修复方案参考
如果希望触发EOF后还能继续接收用户输入,只需要在检测到fgets()返回NULL时调用clearerr(stdin)清除流状态即可,修改后的判断分支如下:
if ((user_input = fgets(input_buf, BUFSIZE, stdin)) == NULL) { clearerr(stdin); // 清除stdin的EOF/错误标志 printf("Invalid input. Try again.\n"); continue; }
如果希望触发EOF后直接退出程序,把continue替换为return 1或者break即可。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

