c-为什么我在使用fgets时必须输入EOF 3次



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

#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%sn",myStr);
}

当我输入一些文本,然后按enter键,然后调用EOF后,一切都正常。

但当我启动程序时,输入"a",然后我尝试调用EOF(使用CtrlZ+⏎;(Windows cmd提示符),CtrlD(Linux)),我必须做三次,程序才能真正打破循环。我最多期待2次。

有人能解释一下EOF、stdin和fgets是如何使用的吗?或者我应该使用其他东西(例如getline)?如果我不清楚我的问题,我很抱歉,你需要什么就问什么。

谢谢。

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

无论如何,在输入文本后,终端会处理您的三个按键,以采取以下操作:

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

在您的程序中,对应于:

  1. 什么都没发生:即使收到了afgets也会一直读取,直到文件或换行符结束
  2. fgets由于文件结束而完成。但是,它不会返回NULL,因为读取了字符,具体为"a"
  3. 旧版本的glibc中的一个错误导致fgets再次尝试读取,即使它之前已经到达文件末尾。fgets由于文件结束而完成,并且由于没有读取任何字符而返回NULL

最新更新