【发布时间】:2020-07-05 15:49:22
【问题描述】:
我写了一个简单的程序来测试 C 中的 scanf() 函数。它基本上是从终端读取的,char char,重印 return value 和 char读;并在遇到 EOF/EOT 或读取 \n newline 时终止。
#include <stdio.h>
#include <stdbool.h>
int main(void) {
char c; int ret;
printf("Enter the chars to test: ");
//LOOP (scan & print) only when return is not EOF and char is not newline
while ( ((ret = scanf("%c", &c)) != EOF) && c!='\n' ) {
printf("%i %c\n", ret, c);
}
return 0;
}
如果按下换行符 (Enter),它将正确终止。但它不会仅仅以单个Ctrl-D 终止。单个Ctrl-D 将刷新键入的“字符”并打印它们。然后它会再次等待输入,尽管EOF 已与Ctrl-D 一起发送。如果我们在第一次 (2x) 之后直接按第二次 Ctrl-D 或只是 Enter 它将终止。因此,您将需要两个连续的Ctrl-D 来终止程序(或本例中的循环)。
例子:
如果你在终端输入987,然后按Enter;然后 1 9、1 8、1 7 将分别打印在换行符上。
如果你在终端输入987,然后按Ctrl-D;那么1 9会打印在同一行(因为输入987后没有输入Enter),1 8, 1 7 将打印在换行符上。然后它仍然会等待更多的输入,除非它通过直接输入第二个连续的 Ctrl-D 或换行符 (Enter) 来终止。所以它(程序)只会在newline 或第二个连续的Ctrl-D 之后停止(退出循环)。
我很困惑。单个Ctrl-D 不应该在这里停止循环吗?收到一个Ctrl-D 后,我应该怎么做才能停止程序(scanf 循环)?
我使用 gcc 9.2.1 在 Lubuntu 19.10 上测试了代码。
【问题讨论】:
-
我认为这基本上与 stdin 通常是 endline-buffered 的事实有关,如果错了,请纠正我。