不同scanf格式之间的差异

我正在通过阅读教科书为编程学校做准备。 有一个我不明白的特殊问题,教科书没有给出答案。

PS:我已经在网上学过一些C ++ / C#,但是从来没有通过正确教授的编程课程,所以我在努力学习一些概念。

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

A) "%d"" %d"
B) "%d-%d-%d""%d -%d -%d"
C) "%f""%f "
D) "%f,%f""%f, %f"

首先,我甚至不明白问题是什么。 教科书的意思是2个字符串是否“等价”?

如果是,有人可以解释这些差异,并可能告诉我如何区分它们吗?

让我们首先尝试A"%d"" %d" ,它们是scanf()等效格式字符串。

" "将执行以下操作。 它永远不会失败。
1)扫描并丢弃(跳过)可选的空白区域。
2)读取非空白空间或文件结束后,如果不是(EOF),则读取的最后一个字符将被放回到stdin

"%d"本身将尝试3件事(它可能会失败)
1)扫描并丢弃(跳过)可选的空白区域。
2)扫描并转换表示十进制整数的数字文本。
3)读取非数字文本或文件结束后,如果不是(EOF),则将最后一个字符读回stdin

" %d"同时执行上述操作。 与"%d"一起做第二次的结果相同。

使用*scanf()说明符注意:

除非规范包含[cn说明符,否则将跳过输入的空白​​字符(由isspace函数指定)。 C11§7.21.6.28


BCD区别?

将鼠标hover在提示1上:

除了上面提到的3之外, scanf()说明符之前的" "是与没有它的等效scanf()格式。

将鼠标hover在提示2上:

只相当于3个中的1个。

将鼠标hover在提示3上:

考虑输入:
“123 -456-789”
“123.456 x”下一个要读的字是什么?

B) "%d-%d-%d""%d -%d -%d"
C) "%f""%f "
D) "%f,%f""%f, %f"

回答:

Awww,你真的想得到答案吗?

来自维基百科

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

scanf是关于继续消耗输入并得到你关心的事情。 格式化字符串中的普通char表示它使用完全相同的char,而不执行任何其他操作。 %d%f可以跳过前导空格。 总而言之,我们得到了:

  • A,它是相同的,因为%d跳过前导空格
  • B, %d-%d-%d是非常严格的,它完全读取整数-然后是另一个整数,依此类推,所以它读取1-2-3井, 1-2-3井,但它失败1 - 2 - 3 。 而另一方面, %d -%d -%d首先跳过空格,读取整数,跳过空格,期望char - ,然后再跳过空格,依此类推……
  • C,尾随空格没有区别
  • D,它是相同的,因为%f跳过前导空格

所以答案是B.