【发布时间】:2012-10-17 02:34:38
【问题描述】:
似乎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什么时候开始扫描用户输入?输入字符的那一刻?还是一直缓冲到一行完成?
【问题讨论】:
-
什么额外提示?您的代码没有打印出来!这是典型的用户错误
-
@AdrianCornish 如果用户出错,我应该如何更正?
-
@AdrianCornish- 我不知道您的评论是否正确,但“更改用户!”评论是史诗:-D
-
@Adrian 你错了,但你的评论也错了,但很有吸引力:D +1
-
显示打印 $'s 的代码行