scanf 格式中的空白字符问题

Raa*_*aja 2 c gcc scanf c++11

我使用 scanf 来读取输入,stdin因为 scanf 被认为比cin. 我发现了以下意外行为:

for(int i = 0; i<3; i++) {
    scanf("%d ", &t);
    printf("The input was %d\n", t);
}
Run Code Online (Sandbox Code Playgroud)

"%d "格式scanf有望读整数,之后忽略空格或换行字符。因此,预期的输出应该是这样的:

0
The input was 0
1
The input was 1
2
The input was 2
Run Code Online (Sandbox Code Playgroud)

但是我得到以下输出:

0
1
The input was 0
2
The input was 1
Run Code Online (Sandbox Code Playgroud)

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

pmg*_*pmg 5

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

一段时间后,您键入2ENTER。由于scanf()仍在等待空白而2不是空白,因此调用成功终止,将 留2在缓冲区中并打印"The input was 1"

等等 ...

所以,不要在转换规范的末尾放置空格——或者其他任何地方,因为大多数转换规范已经做了前导空格抑制。