【问题标题】:Question about format string in scanf function关于scanf函数中格式字符串的问题
【发布时间】:2021-03-07 13:28:10
【问题描述】:

对于以下每对scanf 格式字符串,指出这两个字符串是否等价。如果不是,请说明如何区分它们:

(b) "%d-%d-%d""%d -%d -%d"

所以在这种情况下,我的回答是它们不等价。由于除以% 开头的转换说明符以外的非空白字符不能以空格开头,因此它不会与非空白字符匹配。所以在第一种情况下,第一个和第二个整数后面不允许有空格,而在第二种情况下,前两个整数后面可以有任意数量的空格。

但我看到这本书有不同的答案。它说它们是彼此等价的。 这是书的错误吗?还是我对 scanf 函数中格式字符串的概念有误?

【问题讨论】:

  • 除了%c 和其他几个,所有格式字符串都会自动跳过空格。所以"%d"" %d" 做同样的事情,而"%c"" %c" 的行为不同。您可以使用%d%d%d 扫描1 2 3,但执行%c%c%c 会导致读取1 2
  • @chux 你说得对,我没有仔细阅读,但无论如何我只是证实了他的信念。
  • @SheikYerbouti 公平点。

标签: c scanf


【解决方案1】:

这本书是错的。按照scanf()的规范:

  • 空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格会验证从流中提取的任意数量的空格字符(包括无)。
  • 非空白字符,格式说明符 (%) 除外:任何不是空白字符(空格、换行符或制表符)或格式说明符的一部分(以 % 字符开头)的字符都会导致从流中读取下一个字符的函数,将其与此非空白字符进行比较,如果匹配,则将其丢弃,函数继续使用格式的下一个字符。如果字符不匹配,则函数失败,返回流的后续字符并将其保留为未读。

所以在第一种情况下,当scanf 到达%d 并获得输入时,接下来是-,这意味着scanf 将期望流中的下一个看到non-whitespae 字符-而不是任何其他whitespace 字符。所以合法的输入是1- 2,而不是1 -2

在第二种情况下,在第一个%d 之后,scanf 将允许whitespace,然后将到达non-whitespace,因此它将允许按照上述定义输入1 - 2

【讨论】:

    【解决方案2】:

    "%d-%d-%d""%d -%d -%d"不同,与"%d"无关。


    格式"-" 扫描输入"-" 并在输入" -" 的第一个空格处停止。

    格式" -" 扫描输入"-"" -",因为格式中的" " 匹配输入中的0 个或更多空白字符。

    由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)或直到无法读取更多字符来执行。该指令永远不会失败。 C17dr § 7.21.6.2 5


    问题是:"%d-%d-%d""%d- %d- %d"

    这两个在功能上是相同的。
    我们需要深入了解输入奥术stdin 输入错误来判断电位差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多