【问题标题】:Issue with WhiteSpace character in scanf's formatscanf 格式的空白字符问题
【发布时间】:2014-05-29 14:34:20
【问题描述】:

我使用 scanf 从 stdin 读取输入,因为 scanf 被认为比 cin 快得多。我发现了以下意外行为:

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

scanf 中的 "%d " 格式应读取整数并忽略其后的空格或换行符。因此预期的输出应该是这样的:

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

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

【问题讨论】:

  • " %d" 而不是 "%d "
  • 这类错别字应该记录在scanf标签wiki中。
  • 如果你使用std::ios_base::sync_with_stdio(false)std::cin 的性能应该不会比std::scanf() 差。

标签: c gcc c++11 scanf


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    稍后您输入2ENTER。由于scanf() 仍在等待空格并且2 不是空格,因此调用成功终止,将2 留在缓冲区中并打印"The input was 1"

    等等……

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2018-08-15
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多