首页 > 解决方案 > 关于scanf函数中格式字符串的问题

问题描述

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

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

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

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

标签: cscanf

解决方案


书错了。根据规范scanf()

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

因此,在第一种情况下,当scanf到达%d并获取输入时,next 是-scanf将期望流中的下一个看到non-whitespae字符-而不是任何其他whitespace字符。所以合法的输入是1- 2,但不是1 -2

在第二种情况下,在 first 之后%dscanf将允许whitespaceand than 将到达non-whitespace,因此它将允许1 - 2上述定义的输入。


推荐阅读