所以基本上我想将我写入标准输入的所有内容(包括换行符)复制到字符串以用于哈希目的。我设法做到了这一点,并编写了一些小代码来代表我的问题。
#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 之后,一切正常。
But when I start program enter "a" then I try to call EOF (using Ctrl Z + ⏎ (Windows cmd prompt), Ctrl D (Linux)) I have to do it three times for program to actually break the loop. I was expecting maximum of 2 times.
有人可以解释如何使用 EOF、stdin 和 fgets 工作吗?或者我应该使用其他东西(例如 getline)?如果我不清楚我的问题,我很抱歉,请询问您需要的任何内容。
谢谢。
首先,^Z 或 ^D 是控制字符,对您正在使用的终端有意义,并且有时这意味着终端发出文件结束信号。
无论如何,输入文本后,终端会处理您的三个按键以执行以下操作:
- 刷新输入(即将已输入的字符从终端发送到程序 - 默认情况下,这不会发生,因为终端使用行缓冲)
- 设置文件结束条件
- 再次设置文件结束条件
在您的程序中对应于:
- 什么也没发生:尽管
a
已收到,fgets
继续读取直到文件结尾或换行符
-
fgets
由于文件结束而完成。但是它不会返回 NULL,因为读取了字符,"a"
再具体一点。
-
旧版本 glibc 中的一个错误 https://sourceware.org/bugzilla/show_bug.cgi?id=1190 causes
fgets
尝试再次读取,即使它之前已到达文件末尾。fgets
由于文件结束而完成,并返回NULL
因为没有读到任何字符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)