不同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()
说明符注意:
除非规范包含
[
,c
或n
说明符,否则将跳过输入的空白字符(由isspace
函数指定)。 C11§7.21.6.28
B
, C
, D
区别?
将鼠标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.