在scanf()函数中%符号后的#符号是什么意思?

时间:2015-04-27 09:54:39

标签: c input scanf format-specifiers

以下代码在C

中的含义是什么
scanf("%d%#d%d",&a,&b,&c);

如果给定值1 2 3,则输出为1 0 0

P.S-我知道它与printf()语句一起使用,但在scanf()语句中它给出了随机行为。

2 个答案:

答案 0 :(得分:12)

TL; DR; - #符号格式字符串%后的scanf()代码错误。

说明:

这里的#是一个标记字符,fprintf()和系列允许使用该字符,而不是fscanf()和家庭。

如果是您的代码,#之后%的存在将被视为无效转化说明符。根据7.21.6.2,

  

如果转换规范无效,则行为未定义

因此,您的代码会生成undefined behaviour

提示:您可以查看return的{​​{1}}值,以检查已成功“扫描”了多少元素。

但是,使用scanf() # %d的{​​{1}} FWIW也是undefined behaviour

仅供参考:根据printf()标准文件,章节§7.21.6.1,标志字符部分,(强调我的)

  

     

结果转换为“替代形式”。对于C11转换,它会增加精度,当且仅在必要时,强制结果的第一个数字为零(如果值和精度都是o,则为{{1}打印)。对于0(或0)转换,非零结果的前缀为x(或X)。对于0x0XaAeEfF次转化,转换浮点数的结果总是包含一个小数点字符,即使后面没有数字。 (通常,只有在跟随数字后,才会在这些转化的结果中显示小数点字符。)对于gG次转化,不会从中删除尾随零   结果。 对于其他转化,行为未定义。

答案 1 :(得分:3)

根据the Standard,使用#是非法的。

Its use makes your program invoke Undefined Behaviour

当然,如果您的实施定义了它,则会为您的实施定义行为 ,它会执行您的文档所说的内容。