为什么我在使用 fgets 时必须输入 EOF 3 次?
Why do i have to input EOF 3 times when using fgets?
所以基本上我想将我写入标准输入(包括换行符)的所有内容复制到字符串以用于哈希目的。我设法做到了这一点,并编写了一些小代码来表示我的问题。
#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 prompt), Ctrl D (Linux)) 我必须执行 3 次程序才能真正打破循环。我期待最多 2 次。
谁能解释一下如何使用 EOF、stdin 和 fgets?或者我应该使用其他东西(例如 getline)?很抱歉,如果我不清楚我的问题,请问任何你需要的。
谢谢。
首先,^Z 或 ^D 是控制字符,对您正在使用的终端具有某种意义,有时 意味着终端发出结束信号-文件条件。
无论如何,在输入文本后,终端会处理您的三个按键以执行以下操作:
- 刷新输入(即将输入的字符从终端发送到程序 - 默认情况下不会发生,因为终端使用行缓冲)
- 设置文件结束条件
- 再次设置文件结束条件
在您的程序中对应于:
- 没有任何反应:即使收到
a
,fgets
也会继续读取直到文件结束或换行符
fgets
由于文件结束而完成。但是它不会 return NULL 因为读取了字符,具体来说 "a"
。
- A bug in old versions of glibc 导致
fgets
尝试再次读取,即使它之前已到达文件末尾。 fgets
由于文件结束而完成,returns NULL
因为没有读取字符。
所以基本上我想将我写入标准输入(包括换行符)的所有内容复制到字符串以用于哈希目的。我设法做到了这一点,并编写了一些小代码来表示我的问题。
#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 prompt), Ctrl D (Linux)) 我必须执行 3 次程序才能真正打破循环。我期待最多 2 次。
谁能解释一下如何使用 EOF、stdin 和 fgets?或者我应该使用其他东西(例如 getline)?很抱歉,如果我不清楚我的问题,请问任何你需要的。
谢谢。
首先,^Z 或 ^D 是控制字符,对您正在使用的终端具有某种意义,有时 意味着终端发出结束信号-文件条件。
无论如何,在输入文本后,终端会处理您的三个按键以执行以下操作:
- 刷新输入(即将输入的字符从终端发送到程序 - 默认情况下不会发生,因为终端使用行缓冲)
- 设置文件结束条件
- 再次设置文件结束条件
在您的程序中对应于:
- 没有任何反应:即使收到
a
,fgets
也会继续读取直到文件结束或换行符 fgets
由于文件结束而完成。但是它不会 return NULL 因为读取了字符,具体来说"a"
。- A bug in old versions of glibc 导致
fgets
尝试再次读取,即使它之前已到达文件末尾。fgets
由于文件结束而完成,returnsNULL
因为没有读取字符。