在scanf()函数中,%符号后面加上#符号是什么意思?

6
以下代码是C语言中的代码,它的含义是什么?
scanf("%d%#d%d",&a,&b,&c);

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

P.S- 我知道它通常用于printf()语句,但是在scanf()语句中使用会导致随机行为。


如果我错了,请有人纠正我,但是 # 不仅仅在 printf 中使用吗?我认为它用于在八进制数前面添加 0,在十六进制数前面添加 0x - Levi
在任何scanf手册中都找不到它。我猜你应该有一个警告告诉你没有这样的修饰符。你编译时开启了警告吗?而且@Levi,printf手册显示了#修饰符。 - Eregrith
1
它在gcc编译器中的scanf()函数中工作。 - FossArduino
@Levi 我正在使用gcc版本4.8.2。 - FossArduino
@unwind它打印了a,b和c的1,0,0。 - FossArduino
显示剩余5条评论
2个回答

12

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)。对于aAeEfFgG转换,浮点数的转换结果始终包含小数点字符,即使后面没有数字。(通常,在这些转换的结果中,仅当后面跟着数字时才会出现小数点字符。)对于gG转换,结尾的零不会从结果中移除。对于其他转换,其行为是未定义的。


§7.21.6.1难道不适用于printf而不是scanf吗? - wimh
1
你引用的标准是针对printf系列函数的,这与此处无关。 - P.P
@Wimmel 抱歉,我编辑过以使答案更加恰当。我不是母语为英语的人,所以有时会搞砸。 - Sourav Ghosh
@BlueMoon 我更新了我的答案,请查看上面的评论。感谢指出令人困惑的部分。 :-) - Sourav Ghosh
也许这就是原因,我没有收到任何错误信息,所以感到困惑。 - FossArduino
显示剩余3条评论

3

2
如果转换说明符无效,则行为未定义。 - wimh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接