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

关于使用fgets()读取stdin时feof()返回值异常的技术问询

为什么输入'hello'后feof(stdin)不返回1,循环仍执行?

先看你提供的代码:

fgets(list, 100, stdin);

while (!feof(stdin))
{
    printf("feof!");
    
    fgets(list, 100, stdin);
}

你的核心误解是对feof(stdin)的触发逻辑理解错误:

  • feof不是用来检测输入缓冲区是否为空的,它的作用是标记是否已经发生了“尝试读取超出输入流末尾”的失败操作。只有当你执行的读取操作无法获取到任何数据(因为已经到了流的结尾)时,feof才会返回非0值。
  • 当你输入hello并按下回车,stdin缓冲区里的内容是hello\n。第一个fgets会把这些内容(包括换行符)读取到list中,然后自动在末尾添加字符串结束符\0。这时候stdin缓冲区确实空了,但并没有触发“读取到文件尾”的操作,所以feof(stdin)返回0,循环条件!feof(stdin)为真,因此会进入循环。
  • 进入循环后执行printf("feof!"),接着调用fgets。此时fgets尝试从stdin读取数据,但没有新的输入,它会尝试读取直到EOF,这次读取失败后,stdin的EOF标志才会被设置。下一次循环判断!feof(stdin)时才会为假,循环退出。

另外需要注意:用feof作为循环条件是C语言中常见的错误写法,正确的做法应该直接检查输入函数的返回值,比如:

while (fgets(list, 100, stdin) != NULL) {
    // 处理读取到的内容
}

这种写法可以直接判断读取操作是否成功,避免feof带来的逻辑混淆。

内容的提问来源于stack exchange,提问作者Oliver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:55:16