我目前正在通过教科书为编程学校做准备。这个特殊的问题我不明白,教科书也没有给出答案。
PS:我已经在线学习了一些C ++ / C#,但从未通过正确教授的编程课程,所以我在努力学习一些概念。问:对于以下每对scanf格式字符串,请指明 这两个字符串是否相同。如果他们不是,请显示 如何区分它们。
A)
"%d"
与" %d"
的对比 B)"%d-%d-%d"
与"%d -%d -%d"
C)"%f"
与"%f "
D)"%f,%f"
与"%f, %f"
首先,我甚至不明白问题是什么。教科书的含义是2个字符串是否等同于&#39 ;?
如果是,有人可以解释这些差异,并可能告诉我如何区分它们吗?
答案 0 :(得分:2)
让我们首先尝试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.28
B
,C
,D
差异?
鼠标悬停提示1:
" "
说明符之前的scanf()
,除了上面提到的3之外,是与没有它的等效scanf()格式。
鼠标悬停提示2:
3个等效中只有1个。
鼠标悬停以获取提示3:
考虑输入:
“123 -456-789”
“123.456 x”下一个要读的字是什么?
B)"%d-%d-%d"
与"%d -%d -%d"
的对比
C)"%f"
与"%f "
D)"%f,%f"
与"%f, %f"
答案:
Awww,你真的想得到答案吗?
答案 1 :(得分:0)
空格:任何空白字符都会触发扫描零个或多个空格字符。空白字符的数量和类型不需要在任何一个方向上匹配。
scanf
是关于继续消耗输入并得到你关心的事情。格式化字符串中的普通char表示它使用完全相同的char,而不执行任何其他操作。 %d
,%f
可以跳过前导空格。总而言之,我们得到了:
%d
跳过前导空格%d-%d-%d
非常严格,它在完全-
之后读取一个整数,然后是另一个整数,依此类推,所以它很好地读取1-2-3
,1- 2- 3
,也是,1 - 2 - 3
失败了。另一方面,%d -%d -%d
首先跳过空格,读取整数,跳过空格,期望char -
,然后再跳过空格,依此类推...... %f
也跳过前导空格所以答案是B。