不同的scanf格式之间有什么区别?

5
我正在通过阅读教科书来为编程学校做准备。有一个问题我不明白,而且教科书也没有给出答案。
PS:我在网上学习了一些C++/C#,但从未接受过正式的编程课程,所以我对一些概念感到困惑。
问:对于以下每对scanf格式字符串,请指出这两个字符串是否等价。如果它们不等价,请展示如何区分它们。
A) "%d" 与 " %d" B) "%d-%d-%d" 与 "%d -%d -%d" C) "%f" 与 "%f " D) "%f,%f" 与 "%f, %f"
首先,我甚至不理解这个问题在问什么。教材中的“两个字符串是否等价”是什么意思?
如果它们是等价的,能否有人解释一下它们之间的差异并可能向我展示如何区分它们?

你应该向你的教授请教数学作业……但是,“equivalent”可以被视为“equal”的同义词。“这些格式字符串的输出是否相同?”是/否,然后解释它们如何相同/不同。 - Marc B
很抱歉,这个问题太广泛了,在这里无法回答...你需要一个教程。 - Sourav Ghosh
这个问题实际上非常广泛,但它具有最高的可能质量。 - xenteros
嗨,Marc B,感谢您的编辑!但是由于我正在自学,没有讲师可以询问,因此我不得不来像这样的编程网站。并且感谢buld0zzr,我使用了您提到的问题,在查看以下一些答案之前,对自己有了一些理解! :) - Jason_Kalmatos
2个回答

3
让我们先尝试A"%d"" %d",它们都是scanf()的等效格式字符串。 " "会执行以下操作。它永远不会失败。
1)扫描并跳过可选的空格。
2)在读取非空格或文件结尾后,如果不是(EOF),则最后一个读取的字符被放回到stdin中。 "%d"本身会尝试3件事情(它可能会失败)
1)扫描并跳过可选的空格。
2)扫描并转换表示十进制整数的数字文本。
3)在读取非数字文本或文件结尾后,如果不是(EOF),则最后一个读取的字符被放回到stdin中。 " %d"同时完成以上两个操作。这与仅使用"%d"进行第二个操作是相同的结果。
对于*scanf()说明符,请注意:
输入空格字符(由isspace函数指定)将被跳过,除非规范包括[cn说明符。C11 §7.21.6.2 8 BCD有什么区别?
鼠标悬停获取提示1:
除了上述3个说明符之外,在scanf()说明符前加上" "与不加是等效的。
鼠标悬停获取提示2:
只有3个等效。
鼠标悬停获取提示3:
考虑输入:
"123 -456-789"
"123.456 x" 下一个要读取的字符是什么?
B)"%d-%d-%d""%d -%d -%d"
C)"%f""%f "
D)"%f,%f""%f, %f" 答案:
哎呀,你真的想知道答案吗?

1
嗨,Chux,感谢你抽出时间向我解释这个概念!非常感谢你的帮助! :) - Jason_Kalmatos

0

维基百科中获取:

空格字符:任何空格字符都会触发对零个或多个空格字符的扫描。在任何方向上,空格字符的数量和类型都不需要匹配。

scanf是关于持续消耗输入并获取您关心的内容。格式字符串中的普通字符表示它消耗完全相同的字符,并且不执行其他操作。%d%f可以跳过前导空格。所以,总结一下,我们得到了:

  • A,是一样的,因为%d会跳过前导空格。
  • B,%d-%d-%d非常严格,它在每个-后面读取一个整数,然后再读取另一个整数,以此类推,所以它可以很好地读取1-2-3,也可以很好地读取1- 2- 3,但是对于1 - 2 - 3就会失败。而另一方面,%d -%d -%d会先跳过空格,读取一个整数,再跳过空格,期望字符-,然后再次跳过空格,以此类推...
  • C,尾随空格没有影响。
  • D,是一样的,因为%f也会跳过前导空格。

所以答案是B。


不同意“C,尾随空格没有影响”的说法。请考虑下一个读取的字符是什么。 - chux - Reinstate Monica
嗨,Delta,感谢你抽出时间向我解释这个概念!非常感谢你的帮助! :) - Jason_Kalmatos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接