如何通过只输入一个EOF来结束scanf

我在讨论这个问题。 我正在使用while循环来扫描数字串,需要结束扫描并开始继续我的程序的其余部分。 我只是想不通,如何刷新标准输入或做任何事情都不按两次Ctrl + D. 我只需要发送一次EOF来告诉我的循环结束。

while (! feof (stdin)) {status=scanf ("%d", &array[i]); if ( (status != 1 && status != EOF) ) { printf("\nWrong input.\n"); return 1;} i++;} 

编辑: 这是关于glibc的bug 1190 ,它显然是为了系统V的兼容性而做的(而Solaris的行为方式相同,FreeBSD和NetBSD的行为与预期一致)。

请注意,您的期望只是部分正确。

CTRL-D键不是Unix中的EOF标记。 它会刷新输入缓冲区,以便程序可以读取它。 在Unix下被视为EOF的是一个不返回字符的读取,因此如果在行的开头刷新输入缓冲区,则将其视为EOF。 如果在输入一些尚未刷新的数据(自动结束行刷新输入)后刷新它,则需要刷新两次以使读取不返回任何字符并将被视为EOF。

现在如果我执行这个程序:

 #include  int main() { int status; char tab[200]; while ((status = fscanf(stdin, "%s", tab)) == 1) { printf("Read %s\n", tab); printf("status=%d\n", status); printf("ferror=%d\n", ferror(stdin)); printf("feof=%d\n", feof(stdin)); } printf("\nOut of loop\nstatus=%d\n", status); printf("ferror=%d\n", ferror(stdin)); printf("feof=%d\n", feof(stdin)); return 0; } 

并且我在行的开头按CTRL-D,我得到了我期望的行为:

 foo Read foo status=1 ferror=0 feof=0 ^D Out of loop status=-1 ferror=0 feof=1 

如果我没有完成该行,但按下CTRL-D两次(如上所述,我希望按两次),在foo之后,我要按另一个CTRL-D:

 ./a.out foo^D^DRead foo status=1 ferror=0 feof=1 ^D Out of loop status=-1 ferror=0 feof=1 

我认为这是一个错误,如果在feof为1时输入,则scanf应该立即退出并带有EOF结果。