我使用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有人能帮我理解一下这里的行为吗?
发布于 2014-04-15 09:59:25
当您键入1ENTER时,库代码将看到1并将其与"%d"匹配。然后,它将看到ENTER并开始将其与" "匹配。当没有其他东西进来时,它就在等待,等待,等待。
过一段时间,您可以输入2ENTER。由于scanf()仍然在等待空白,而2不是空白,所以调用成功地终止,将2留在缓冲区中并打印"The input was 1"。
等等..。
所以,不要将空格放在转换规范的末尾--或者其他地方,因为大多数转换规范已经完成了空格抑制。
发布于 2014-04-15 09:57:22
把空间放在%d前面。或者,更好的是,移除它!
此外,在依赖具有有效值的scanf()之前,请检查t的返回值。
https://stackoverflow.com/questions/23080324
复制相似问题