在下面的代码中,我将mac地址存储在 char数组。
中但即使我将它存储在char变量中,同时打印它的打印如下:
ffffffbb
ffffffcc
ffffffdd
ffffffee
ffffffff
这是代码:
#include<stdio.h>
int main()
{
char *mac = "aa:bb:cc:dd:ee:ff";
char a[6];int i;
sscanf(mac,"%x:%x:%x:%x:%x:%x",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);
for( i = 0; i < 6;i++)
printf("%x\n",a[i]);
}
我需要输出以下列方式:
aa
bb
cc
dd
ee
ff
当前的printf语句是
printf("%x\n",a[i]);
即使我将ffffffaa
存储在char数组中,我如何获得所需的输出以及为什么printf语句打印aa
?
答案 0 :(得分:4)
您正在使用%x
,期望参数为unsigned int *
,但您只是传递char *
。这很危险,因为sscanf()
将执行int
大小的写入,可能在分配给变量的空间之外写入。
将sscanf()
的转化说明符更改为%hhx
,即unsigned char
。然后更改打印以匹配。当然,还要制作a
数组unsigned char
。
同时检查以确保sscanf()
成功:
unsigned char a[6];
if(sscanf(mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
a, a + 1, a + 2, a + 3, a + 4, a + 5) == 6)
{
printf("daddy MAC is %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
a[0], a[1], a[2], a[3], a[4], a[5]);
}
答案 1 :(得分:3)
确保将您的a
数组视为无符号字符,即
unsigned char a[6];
在
printf("%x\n",a[i]);
表达式a[i]
产生char
。但是,标准does not specify是char
是签名还是未签名。在您的情况下,编译器显然将其视为签名类型。
由于在Mac地址的所有字节中设置了最高有效位(每个字节大于或等于0x80),a[i]
被视为负值,因此printf
生成十六进制表示负值。