sscanf - warning unsigned int format different type arg

===Sample1==========================================================================================================================

Question:

uint8_t u1=0xff,u2=0xff,u3=0xff,u4=0xff;
char str[]="ab-cd";
我开始使用如下代码:
sscanf(str,"%x-%x",&u2,&u3);
执行结果:

u2 = ab,u3=cd; 

但是:
u1或u2(根据系统不同而不同,因为栈的增长方向)的值被改变,变为零。 所以这里发生了越界。

我想问各位大侠有木有合适的格式转换符来做这个事情,是%什么。

Answer:

%hx, h代表short

%hhx, hh代表unsigned char

这里uint8_t, 8bit就用hhx就行了。

===Sample2==========================================================================================================================

Question:

    int main()
    {
    char *mm="00:3e:4c:00:23:54";
    unsigned char mm_mac[6];
    sscanf(mm, "%02x:%02x:%02x:%02x:%02x:%02x", &mm_mac[0], &mm_mac[1], &mm_mac[2], &mm_mac[3], &mm_mac[4], &mm_mac[5] );
    return 0;
    }
请问如何消除下面的warning?

mac.c:9: warning: unsigned int format, different type arg (mm_mac 3)
mac.c:9: warning: unsigned int format, different type arg (mm_mac 4)
mac.c:9: warning: unsigned int format, different type arg (mm_mac 5)
mac.c:9: warning: unsigned int format, different type arg (mm_mac 6)
mac.c:9: warning: unsigned int format, different type arg (mm_mac 7)
mac.c:9: warning: unsigned int format, different type arg (mm_mac 8)

Answer:

warning的原因应该是因为字节长度不匹配。

可以用其他变量中转,%02x只是告诉sscanf取buffer数据时取两个字节就结束,但是写入mm_mac必定会写入4个字节,这样会覆盖后面的内容。

这个代码实在是不安全,如果是big-endian的话,你说数据存储到哪里去了?应该写成%02hhx(编译器需支持这个标准的C99)。

你可能感兴趣的:(sscanf - warning unsigned int format different type arg)