以下代码在C
中的含义是什么scanf("%d%#d%d",&a,&b,&c);
如果给定值1 2 3
,则输出为1 0 0
P.S-我知道它与printf()
语句一起使用,但在scanf()
语句中它给出了随机行为。
答案 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
)。对于0x
,0X
,a
,A
,e
,E
,f
和F
次转化,转换浮点数的结果总是包含一个小数点字符,即使后面没有数字。 (通常,只有在跟随数字后,才会在这些转化的结果中显示小数点字符。)对于g
和G
次转化,不会从中删除尾随零 结果。 对于其他转化,行为未定义。
答案 1 :(得分:3)
根据the Standard,使用#
是非法的。
Its use makes your program invoke Undefined Behaviour
当然,如果您的实施定义了它,则会为您的实施定义行为 ,它会执行您的文档所说的内容。