C语言 从字符数组元素中获取最后两个字符



尝试打印数组元素,如下面

typedef struct Info
{
char MacAdd[2];                      
} Info;
char MAC[100];
sprintf(MAC, "%x:%x%c", Info->MacAdd[0], Info->MacAdd[1],'');
printf("MAC %s",MAC);

得到的输出是——>ffffff98: ffffffa4

如何得到像——>98: a4

Info结构中的MacAdd数组被声明为char数组。但char通常是符号类型。

当你调用printf时,某些"默认参数转换"发生。其中,类型char被提升为int。由于0x98作为有符号字符实际上是负的(它是-104),因此当发生这种情况时,它会自动扩展符号—这就是额外的ff的来源。ffffff98是-104的32位有符号版本,因此保留该值。

至少有三种方法可以解决这个问题,按照我认为最不吸引人的顺序:

  1. MacAdd数组重新声明为unsigned char数组
  2. 将printf格式更改为"%hhx:%hhx"hh告诉printf你的值原来是一个char,这要求printf撤销提升,实际上,剥离不需要的ff的back。
  3. 将呼叫改为sprintf(MAC, "%x:%x", Info->MacAdd[0] & 0xff, Info->MacAdd[1] & 0xff);

正如@Aconcagua在评论中指出的那样,一旦你去掉了ff,你可能还需要稍微调整一下你的printf格式,以处理个位数地址。


脚注:上面的解决方案3相当糟糕,我不会认真推荐它。这是我们在Ritchie最初的C编译器时代使用的,当时unsigned char%hhx都还没有被发明。

相关内容

  • 没有找到相关文章

最新更新