C 为什么在使用FGET时必须输入EOF 3次?

C 为什么在使用FGET时必须输入EOF 3次?,c,while-loop,stdin,eof,fgets,C,While Loop,Stdin,Eof,Fgets,所以基本上,我想将我写入stdin的所有内容(包括换行符)复制到string中,以用于散列。我设法做到了这一点,并编写了一些小代码来表示我的问题 #include <stdio.h> #include <string.h> #include <stdlib.h> #define BUFFERSIZE 10000 int main() { char *myStr = calloc(1,1); char buffer[BUFFERSIZE]; while(

所以基本上,我想将我写入stdin的所有内容(包括换行符)复制到string中,以用于散列。我设法做到了这一点,并编写了一些小代码来表示我的问题

#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);

}
#包括
#包括
#包括
#定义缓冲区大小10000
int main()
{
char*myStr=calloc(1,1);
字符缓冲区[BUFFERSIZE];
while(fgets(buffer,BUFFERSIZE,stdin)!=NULL){
myStr=realloc(myStr,strlen(myStr)+1+strlen(buffer));
strcat(myStr,缓冲区);
}
printf(“\n%s\n”,myStr);
}
当我输入一些文本,然后按enter键,然后调用EOF时,一切正常

但当我启动程序时,输入“a”,然后我尝试调用EOF(使用Ctrl Z+⏎ (Windows cmd提示符)、Ctrl D(Linux))我必须执行三次,程序才能真正中断循环。我最多期待2次

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


谢谢。

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

无论如何,输入文本后,终端会处理三次按键,以执行以下操作:

  • 刷新输入(即,将迄今为止从终端输入的字符发送到程序-默认情况下,这不会发生,因为终端使用行缓冲)
  • 设置文件结束条件
  • 再次设置文件结束条件
  • 在您的程序中,对应于:

  • 什么也没发生:即使收到
    a
    fgets
    也会一直读取,直到文件或换行符结束
  • fgets
    由于文件结束而完成。但是,它不会返回NULL,因为读取了字符,具体而言是a
  • fgets
    由于文件结束而完成,并返回
    NULL
    ,因为没有读取字符

  • 这是一个。您不能使用Ctrl+Z,因为终端使用Ctrl+Z挂起进程@SergioFormigini Ctrl+Z是Windows上的EOF字符。好的!我忘记了Windows:p请注意,可以通过不换行的短返回或通过
    feof
    来检测“丢失”EOF。