scanf格式的WhiteSpace字符问题

时间:2014-04-15 09:55:19

标签: c gcc c++11 scanf

我使用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

有人可以帮我理解这里的行为吗?

2 个答案:

答案 0 :(得分:4)

当您输入1ENTER时,库代码会看到1并将其与"%d"匹配。然后它会看到ENTER并开始将其与" "匹配。没有其他任何东西进入,它等待,等待等待。

过了一会儿,你输入2ENTER。由于scanf()仍在等待空格而2不是空格,因此调用会成功终止,将2保留在缓冲区并打印"The input was 1"

依旧......

因此,不要在转换规范的末尾添加空格 - 或者在其他任何地方放置空格,因为大多数转换规范已经执行前导空格抑制。

答案 1 :(得分:1)

将空格放在 %d之前。或者,更好的是,删除它!

另外,在依赖scanf()具有有效值之前,请检查t的返回值。