我目前正在通过阅读教科书为自己的编程学校做准备。有一个问题我不明白,课本上也没有给出答案。
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
函数指定),除非该规范包含[
、c
或n
说明符。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