以下代码是C语言中的代码,它的含义是什么?
scanf("%d%#d%d",&a,&b,&c);
如果给定的值为1 2 3
,则输出为1 0 0
P.S- 我知道它通常用于printf()
语句,但是在scanf()
语句中使用会导致随机行为。
scanf("%d%#d%d",&a,&b,&c);
如果给定的值为1 2 3
,则输出为1 0 0
P.S- 我知道它通常用于printf()
语句,但是在scanf()
语句中使用会导致随机行为。
TL;DR; - 在scanf()
函数的格式字符串中,在%
符号之后加上#
是错误的代码。
Explanation:
这里的#
是一个标志字符,它在fprintf()
和相关函数中被允许使用,但在fscanf()
和相关函数中不允许使用。
在您的代码中,%
之后出现的#
被视为无效的转换说明符。根据7.21.6.2,
如果转换说明符无效,则行为未定义
因此,您的代码会产生未定义的行为。
提示:您可以检查scanf()
的return
值来检查有多少元素被“成功”扫描。
然而,FWIW,在printf()
中使用#
与%d
也是未定义的行为。
仅供参考:根据C11
标准文档,第§7.21.6.1章,标志字符部分,(强调是我自己加的)
#
结果被转换为“替代形式”。对于
o
转换,如果必要的话,它将增加精度以强制结果的第一位数字为零(如果值和精度都是0
,则只打印一个0
)。对于x
(或X
)转换,非零结果前面有0x
(或0X
)。对于a
、A
、e
、E
、f
、F
、g
和G
转换,浮点数的转换结果始终包含小数点字符,即使后面没有数字。(通常,在这些转换的结果中,仅当后面跟着数字时才会出现小数点字符。)对于g
和G
转换,结尾的零不会从结果中移除。对于其他转换,其行为是未定义的。
printf
而不是scanf
吗? - wimh
#
不仅仅在printf
中使用吗?我认为它用于在八进制数前面添加0
,在十六进制数前面添加0x
。 - Leviscanf
手册中都找不到它。我猜你应该有一个警告告诉你没有这样的修饰符。你编译时开启了警告吗?而且@Levi,printf手册显示了#
修饰符。 - Eregrith