【问题标题】:Reading Hex from command line to unsigned char and unsigned short从命令行读取 Hex 到 unsigned char 和 unsigned short
【发布时间】:2016-09-07 18:50:47
【问题描述】:
int main(int argc, char *argv[]){
    unsigned char Data = 0xff;
    unsigned short addr = 0xff;

    sscanf(argv[1], "%u", &Data);
    sscanf(argv[2], "%hu", &addr);

    printf("data is %u addr is %hu ", Data, addr);

    return 0;
}

您好,我正在尝试将十六进制格式的命令行参数读入 unsigned char 和 unsigned short。请检查上面的代码sn-p。输出始终为 0xff(初始化值)。我可以知道需要更改什么来读取输入吗?

【问题讨论】:

  • %uData 的不正确格式说明符,声明为 char
  • 另外,出现提示时您输入什么值?
  • 运行命令:./out 0x1e 0x2e

标签: c


【解决方案1】:

通过使用%u 说明符,您告诉sscanf 您要读取十进制格式(以10 为基数)的an unsigned int。如果您想要十六进制输入(以 16 为基数),您必须使用 %x 说明符。此外,您需要指定正确的整数大小。对于unsigned char,您需要hh 作为长度修饰符。使用错误的长度修饰符会导致未定义的行为。

所以你应该试试%hhx 说明符。比如:

#include <stdio.h>

int main(void){
    unsigned char Data = 0xff;

    char argv1[20] = "0x40";

    sscanf(argv1, "0x%hhx", &Data);

    printf("data is %u\n", Data);

    return 0;

}

输出:数据为 64

对于十六进制的unsigned short,您应该使用%hx

【讨论】:

  • 我尝试了%x,它应该会失败,但它确实有效。为什么?因为我在PC上而且它是小端的?堆栈后来损坏了吗?
  • 它可以工作。但是,1)它会破坏数据之外的内存; 2)在不允许未对齐访问的系统上,如果Data与int类型未对齐,则会导致segfault
  • @Jean-FrançoisFabre 当像我第一次那样使用不正确的说明符(即 %x)时,sscanf 需要 int*,它可能写的不仅仅是 unsigned char。换句话说,在分配的内存之外写入(并导致UB)。在原始答案中写 %x 是我的错误 - 现在已更正(在 Serge 的帮助下)。
  • 正确的术语是未定义的行为。这是在任何情况下都应该避免的事情。
  • @Olaf 除了提到 UB 之外,重要的是展示什么是 UB ;)
【解决方案2】:

C99 及更高版本的 unsigned char 专用符是 %hhx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多