它似乎在按下键scanf
时开始扫描输入,我想用下面的代码来验证这一点(为简单起见,我消除了错误检查和处理)。Enter
#include <stdio.h>
int main(int argc, char **argv) {
/* disable buffering */
setvbuf(stdin, NULL, _IONBF, 0);
int number;
scanf("%d", &number);
printf("number: %d\n", number);
return 0;
}
另一个问题是,在我禁用输入缓冲之后(只是为了验证结果;我知道实际上我应该永远不要这样做,以防它干扰结果),输出是(注意额外的提示):
$ ./ionbf
12(space)(enter)
number: 12
$
$
这与启用输入缓冲时的输出不同(没有额外提示):
$ ./iofbf
12(space)(enter)
number: 12
$
启用缓冲区时似乎消耗了换行符。我在两台不同的机器上进行了测试,一台安装了 gcc 4.1.2 和 bash 3.2.25,另一台安装了 gcc 4.4.4 和 bash 4.1.5,两者的结果相同。
问题是:
- 如何解释启用和禁用输入缓冲时的不同行为?
- 回到最初的问题,什么时候
scanf
开始扫描用户输入?输入字符的那一刻?还是缓冲直到一行完成?