【问题标题】:What does a # sign after a % sign in a scanf() function mean?scanf() 函数中 % 符号后的 # 符号是什么意思?
【发布时间】:2015-07-05 17:06:09
【问题描述】:

以下代码是什么意思,在C语言中

scanf("%d%#d%d",&a,&b,&c);

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

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

【问题讨论】:

  • 如果我错了,请有人纠正我,但#不是仅用于printf吗?我以为它是用来将0 加到八进制数和0x 到十六进制
  • 在任何 scanf 手册页中都找不到它。我想你应该有一个警告告诉你没有这样的修饰符。你编译时有警告吗?确实@Levi,printf man 显示# 修饰符
  • 它在 scanf() 的 gcc 编译器中工作
  • @FossArduino:你使用的是什么版本的 gcc?在我的 (4.9.2) 上,我收到警告
  • 它返回是什么?可能是1,表示只有第一次转换成功,因此b和c没有初始化。

标签: c input scanf format-specifiers


【解决方案1】:

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

解释:

这里的#是一个flag字符,在fprintf()和family中是允许的,在fscanf()和family中是不允许的。

在您的代码中,% 之后出现的# 被视为无效的转换说明符。根据 7.21.6.2,

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

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

提示:您可以检查scanf() 的return 值来检查有多少元素被“扫描”成功。


但是,FWIW,在printf() 中使用# 和%d 也是undefined behaviour。

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

#

结果被转换为“替代形式”。对于o 转换,当且仅在必要时,它会增加精度以强制结果的第一个数字为零(如果值和精度都是0,则打印单个0)。对于x(或X)转换,非零结果以0x(或0X)为前缀。对于a、A、e、E、f、F、g 和 G 转换,浮点数的转换结果始终包含小数点字符,即使后面没有数字。 (通常,小数点字符仅在其后有数字时才会出现在这些转换的结果中。)对于g 和G 转换,不会从 结果。 对于其他转化,行为未定义。

【讨论】:

  • 第 7.21.6.1 条不适用于 printf 而不是 scanf?
  • 您从标准中引用的内容是针对 printf 系列功能的,在这里无关紧要。
  • @Wimmel 抱歉,我进行了编辑以使答案正确。我不是以英语为母语的人,所以有时我会搞砸。
  • @BlueMoon 更新了我的答案,请参阅上面的评论。感谢您指出令人困惑的部分。 :-)
  • 也许这就是原因,我没有收到任何错误,所以很困惑。
【解决方案2】:

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

Its use makes your program invoke Undefined Behaviour.

当然,如果你的实现定义了它,它就是为你的实现定义的行为,它会按照你的文档所说的那样做。

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 2010-09-29
  • 2011-04-18
相关资源
最近更新 更多