不同scanf格式之间的差异

时间:2016-06-30 14:27:48

标签: c formatting scanf

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

PS:我已经在线学习了一些C ++ / C#,但从未通过正确教授的编程课程,所以我在努力学习一些概念。

  

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

     

A)"%d"" %d"的对比     B)"%d-%d-%d""%d -%d -%d"
    C)"%f""%f "
    D)"%f,%f""%f, %f"

首先,我甚至不明白问题是什么。教科书的含义是2个字符串是否等同于&#39 ;?

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

2 个答案:

答案 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

BCD差异?

鼠标悬停提示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)

来自Wikipedia

  

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

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

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

所以答案是B。