【问题标题】:What is the need of hh and h format specifiers?hh 和 h 格式说明符需要什么?
【发布时间】:2014-03-13 23:37:32
【问题描述】:

在下面的代码中,mac_str 是字符指针macuint8_t 数组

 sscanf(mac_str,"%x:%x:%x:%x:%x:%x",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);

当我尝试上面的代码时,它给了我一个警告:

warning: format ‘%x’ expects argument of type ‘unsigned int *’, but argument 8 has type ‘uint8_t *’ [-Wformat]

但我在他们指定的一些代码中看到了

sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);

它没有给出任何警告,但两者的工作方式相同。

使用 hhx 而不仅仅是 x 有什么需要?

【问题讨论】:

  • hh 代表历史猜测,代表 一半。也就是一个字节。
  • 使用sscanf("%" SCNx8 , &x);
  • @Joseph 我没有说它是重复的。但是,OP 可能会在其他主题中发现一些有趣的信息。

标签: c scanf format-specifiers


【解决方案1】:

hh 是一个长度修饰符,用于指定参数的目标类型。转换格式说明符x 的默认值为unsigned int*。使用hh,它变为unsigned char*signed char*

更多详情请参考表格herein

【讨论】:

  • C11 §7.21.6.2 说“x ....相应的参数应该是一个指向无符号整数的指针。”我对signed int*一无所知。
【解决方案2】:

&mac[0] 是一个指向unsigned char 的指针。1%hhx 表示对应的参数指向一个unsigned char。方孔使用方钉:格式字符串中的转换说明符必须与参数类型匹配。


1 实际上,&mac[0] 是指向uint8_t 的指针,而%hhx 对于uint8_t 仍然是错误的。它在许多实现中“有效”,因为uint8_t 在许多实现中与unsigned char 相同。但正确的格式是"%" SCNx8,如:

#include <inttypes.h>
…
scanf(mac_str, "%" SCNx8 "… rest of format string", &mac[0], … rest of arguments);

【讨论】:

  • 严格来说,我认为uint8_t存在一定和unsigned char一样。
  • @StephenCanon:我希望如此,但我很难解释 C 2011 7.20.1 1:“当 typedef 名称仅在初始 u 不存在或存在时不同时被定义,……”。我想知道由于固执,实现是否可以提供uint8_t 但不能提供int8_t,然后不被7.20.1 1 强迫使uint8_t 成为unsigned charchar。然后实现可以提供另一种整数类型,比如__byte,它是一个无符号的 8 位整数,但不同于charunsigned char。所以别名规则将适用,等等。
【解决方案3】:

hhx 将输入转换为无符号字符,而x 转换为无符号整数。由于uint8_tunsigned char 的typedef,hhx 修复了警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2010-11-03
    • 2013-06-22
    相关资源
    最近更新 更多