我使用scanf来读取stdin
的输入,因为scanf被认为比cin
快得多。我发现了以下意外行为:
for(int i = 0; i<3; i++) {
scanf("%d ", &t);
printf("The input was %d\n", t);
}
"%d "
中的scanf
格式应该读取一个整数并忽略其后的空格或换行符。因此,预期的输出应该是这样的:
0
The input was 0
1
The input was 1
2
The input was 2
但是我得到了以下输出:
0
1
The input was 0
2
The input was 1
有人可以帮我理解这里的行为吗?
答案 0 :(得分:4)
当您输入1ENTER
时,库代码会看到1
并将其与"%d"
匹配。然后它会看到ENTER
并开始将其与" "
匹配。没有其他任何东西进入,它等待,等待等待。
过了一会儿,你输入2ENTER
。由于scanf()
仍在等待空格而2
不是空格,因此调用会成功终止,将2
保留在缓冲区并打印"The input was 1"
。
依旧......
因此,不要在转换规范的末尾添加空格 - 或者在其他任何地方放置空格,因为大多数转换规范已经执行前导空格抑制。
答案 1 :(得分:1)
将空格放在 %d
之前。或者,更好的是,删除它!
另外,在依赖scanf()
具有有效值之前,请检查t
的返回值。