C语言 不同扫描格式之间的差异



我目前正在通过阅读教科书为自己的编程学校做准备。有一个问题我不明白,课本上也没有给出答案。

PS:我在网上学过一些c++/c#,但从来没有上过正规的编程课,所以我对一些概念很吃力。

Q:对于下面的每一对scanf格式字符串,表示两个字符串是否相等。如果不是,就展示出来如何区分它们

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

首先,我甚至不明白这个问题在问什么。课本上所说的两个字符串是否"相等"是什么意思?

如果是,谁能解释一下它们的区别,并可能告诉我如何区分它们?

让我们先试试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


B, C, D差异?

鼠标移到提示1:

<引用类>

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

鼠标移到提示2:

<引用类>

3个中只有1个相等。

鼠标移到提示3:

<引用类>

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

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

答:

<引用类>

啊,你真的想知道答案吗?

来源维基百科

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

scanf是关于不断消耗输入并得到你关心的东西。格式字符串中的普通字符意味着它消耗完全相同的字符,而不做任何其他事情。%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

相关内容

  • 没有找到相关文章

最新更新