You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么按下Ctrl+d时调用fgets会导致C语言程序进入无限循环?

异常现象根因说明

你遇到的无限循环问题是标准输入流EOF标志未被处理导致的,具体逻辑如下:

  • Ctrl+D在类Unix终端下是EOF(输入流结束)触发快捷键,Windows下对应触发快捷键为Ctrl+Z
  • 当EOF被触发时,fgets()会返回NULL,同时C标准库会自动将stdin流的EOF标志位置为生效状态
  • 你的代码中检测到fgets()返回NULL后,仅打印提示就直接continue进入下一轮循环,没有做任何清除stdin EOF标志的操作
  • 下一轮循环调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:54:05