【问题标题】:Leading whitespace when using scanf() with " %c"将 scanf() 与“%c”一起使用时的前导空格
【发布时间】:2019-10-08 21:00:55
【问题描述】:

我已经阅读过,每个人都说在扫描单个字符时使用" %c",因为输入流的开头可能有空格。

好的,公平的。但这仅适用于所述输入流中的第一个字符吗?如果我现在正在扫描由许多连续字符组成的字符串中的单个字符怎么办? (例如:abcdef)

现在不会使用" %c" 作为格式说明符吗?

【问题讨论】:

  • 您是新的贡献者,欢迎您,但这不是您提出问题的方式。您应该处理您的代码并将到目前为止所做的工作放在这里。阅读帮助中心主题,详细了解您可以提出哪些问题以及您必须避免哪些类型的问题。 Help CenterWhat types of questions should I avoid asking?What topics can I ask about here?。社区一定很乐意帮助您解决正确的问题。
  • " %c" 中的空格字符匹配零个或多个空格字符。那里的关键词是“零”。所以它适用于您的示例。
  • 在扫描前一个输入(例如换行符)后,可能存在“输入流开头的空白”,但输入缓冲区中剩余的空白不是那么多。虽然过滤器不关心它为什么在那里,它只是过滤它。
  • @Armin 有什么地方我可以问这样的一般性问题吗?

标签: c format scanf whitespace format-specifiers


【解决方案1】:

当你说scanf("%d", &...) 来读取一个整数时,它实际上会跳过前导空格,然后读取一个整数。

当您说scanf("%f", &...) 读取浮点数时,它实际上会跳过前导空格,然后读取浮点数。

当你说scanf("%s", ...) 来读取一个字符串时,它实际上会跳过前导空格,然后读取一个字符串。

您是否开始看到一种模式?好吧,不要抱太大希望,因为:

当你说scanf("%c", &...) 来读取一个字符时,它确实跳过前导空格。如果有前导空格,则第一个空格字符是%c 读取的字符。

%c 的这个奇怪的例外对于最初设计 scanf 的人来说是完全合理的,但从那以后它一直让其他人感到困惑。

这就是为什么,如果你真正想读的是一个非空白字符,你必须使用格式说明符" %c",在%之前有一个空格。该空格匹配零个或多个空格字符,因此会跳过任何前导空格,并确保%c 会尝试为您读取非空格字符。

而且由于这一切都如此令人困惑、违反直觉且难以解释,有时您会看到“在%c always 之前使用前导空格”这样更简单的解释,因为任何人*想要阅读的内容都是无论如何,非空白字符。

[* 我所说的“任何人”是指任何正在编写初级 C 程序的初学者。从理论上讲,某处可能有一位专家想要使用%c 来读取空白字符。但专家一般不会使用scanf 做任何事情。]

【讨论】:

    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多