我刚开始使用十六进制值(使用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
}
在上面的代码中,为什么x
和y
的值丢失/被覆盖,我该如何解决?
C11
转换说明符,在第§7.21.6.2章中引用%x
,>
x
匹配一个可选的带符号的十六进制整数,其格式相同与
strtoul
函数的主题序列所期望的值相同基本参数为16。 相应的参数应为指向无符号整数。您正在提供参数作为指向
unsigned char
的指针。
也从同一章,P10
[...]除非
*
指示分配抑制,否则转换的结果放置在后面第一个参数指向的对象中尚未收到转换结果的format参数。如果这个对象没有适当的类型,或者无法表示转换结果在对象中,行为是不确定的。因此,它调用未定义的行为。
如果参数是指向%hhx
的指针,则需要将格式说明符用作unsigned char
。
限定符“%x”适用于整数类型。您可以启用编译器警告,编译器将警告您有关类型的滥用。您的变量在堆栈上并且占据着紧密的地址。scanf将通过的地址解释为占该单个字节更多的变量的地址。这就是scanf覆盖变量的原因。您可以将变量的类型替换为int以避免出现问题