c - 如何以特定方式打印十六进制?

标签 c printf hex

在下面的代码中,我将 mac 地址存储在一个字符数组中。

但即使我将它存储在一个 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]);

即使我将 aa 存储在 char 数组中,我如何才能获得所需的输出以及为什么 printf 语句打印 ffffffaa

最佳答案

您正在使用 %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]);
}

关于c - 如何以特定方式打印十六进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21697891/

相关文章:

c - 在gets之前输入C.scanf。问题

c - "stack smashing detected"by getline & printf - 我真的不明白为什么

c - 防止用户跳转到 C 中带有 "enter button"的另一行

c# - 如何使用 .NET 从十六进制颜色代码中获取颜色?

debugging - Visual Studio 调试器 - 以十六进制显示整数值

java - 给我解释一下十六进制 'x'中的 '0xf0'是从哪里来的

c - 4 个嵌套 'for' 循环的最佳和最坏情况时间复杂度?

c - 使用for循环创建链表

c - valgrind 在打印分配的字符串时报错

c - strcpy 和 printf 多维字符数组 C