【问题标题】:Why do i have to input EOF 3 times when using fgets?为什么我在使用 fgets 时必须输入 3 次 EOF?
【发布时间】:2015-04-20 23:06:15
【问题描述】:

所以基本上我想将我写入标准输入的所有内容(包括换行符)复制到字符串以用于哈希目的。我设法做到了这一点,并编写了小代码来代表我的问题。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFFERSIZE 10000

int main()
{
char *myStr = calloc(1,1);
char buffer[BUFFERSIZE];

while( fgets(buffer, BUFFERSIZE , stdin) != NULL ){
  myStr = realloc(myStr, strlen(myStr)+1+strlen(buffer) );
  strcat( myStr, buffer );
}
printf("\n%s\n",myStr);

}

当我输入一些文本然后按 ENTER 并在我调用 EOF 之后一切正常。

但是当我启动程序时输入“a”然后我尝试调用 EOF(使用 Ctrl Z + (Windows cmd 提示符),Ctrl D (Linux)) 我必须执行 3 次才能让程序真正打破循环。我预计最多2次。

谁能解释一下使用 EOF、stdin 和 fgets 是如何工作的?还是我应该使用其他东西(例如 getline)?很抱歉,如果我不清楚我的问题,请问您需要什么。

谢谢。

【问题讨论】:

  • 不能使用Ctrl+Z,因为终端使用Ctrl+Z挂起进程!
  • @SergioFormiggini Ctrl+Z 是 Windows 上的 EOF 字符。
  • 好的!我忘记了 Windows:p

标签: c while-loop stdin eof fgets


【解决方案1】:

首先,^Z 或 ^D 是控制字符,对您正在使用的终端意味着某些东西,而 有时 意味着终端发出文件结束条件的信号。 p>

不管怎样,输入文本后,终端会处理您的三个按键以执行以下操作:

  1. 刷新输入(即将从终端输入的字符发送到程序 - 默认情况下不会发生,因为终端使用行缓冲)
  2. 设置文件结束条件
  3. 再次设置文件结束条件

在您的程序中对应于:

  1. 什么都没有发生:即使收到afgets 仍会继续读取直到文件结束或换行
  2. fgets 由于文件结束而完成。但是它不会返回 NULL,因为读取了字符,具体来说是 "a"
  3. fgets 由于文件结束而完成,并返回 NULL 因为没有读取字符。

【讨论】:

  • 请注意,“丢失”的 EOF 可以通过没有换行符的短返回或通过 feof 检测到。
猜你喜欢
  • 2016-01-08
  • 2011-11-14
  • 2022-07-06
  • 2014-02-15
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多