【问题标题】:Input hexadecimal value in multiple unsigned char variable在多个 unsigned char 变量中输入十六进制值
【发布时间】:2020-03-17 07:15:24
【问题描述】:

我刚刚开始使用十六进制值(c 语言),下面是代码:

int main(){

    unsigned char x, y, z;
    scanf("%x", &x);
    scanf("%x", &y);
    scanf("%x", &z);
    printf("val are: %x, %x, %x\n",x,y,z);
    return 0
}

在上面的代码中,为什么xy的值会丢失/覆盖,我该如何解决?

【问题讨论】:

  • 你能解释一下我做错了什么吗?
  • @HARSHGUPTA 你使用了%x 而不是%2hhx。那是你做错了。
  • 节省时间,启用所有编译器警告。

标签: c char hex scanf unsigned


【解决方案1】:

引用C11,第 7.21.6.2 章,%x 转换说明符,(__emphasis mine_)

x

匹配一个可选带符号的十六进制整数,其格式相同 正如strtoul 函数的主题序列所期望的那样,其值为 16 为基本参数。 对应的参数应该是一个指向 无符号整数。

您将参数作为指向unsigned char 的指针提供。

另外,来自同一章,P10

[...] 除非 * 指示分配抑制,否则 转换的结果放在后面的第一个参数指向的对象中 尚未收到转换结果的格式参数。如果这个对象 没有合适的类型,或者转换的结果无法表示 在对象中,行为是未定义的。

因此,您的代码会调用未定义的行为。

如果参数是指向unsigned char 的指针,则需要将格式说明符用作%hhx

【讨论】:

    【解决方案2】:

    限定符 "%x" 适用于整数类型。 您可以启用编译器警告,编译器会警告您滥用类型。 您的变量在堆栈上并占用关闭地址。 scanf 将传递的地址解释为占用更多单个字节的变量的地址。 这就是 scanf 覆盖变量的原因。 您可以将变量的类型替换为 int 以避免您的问题

    int main(){
    
        unsigned int x, y, z;
        scanf("%x", &x);
        scanf("%x", &y);
        scanf("%x", &z);
        printf("val are: %x, %x, %x\n",x,y,z);
        return 0
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 2012-05-22
      • 2023-03-30
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      相关资源
      最近更新 更多