===Sample1==========================================================================================================================
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(根据系统不同而不同,因为栈的增长方向)的值被改变,变为零。 所以这里发生了越界。
我想问各位大侠有木有合适的格式转换符来做这个事情,是%什么。
%hx, h代表short
%hhx, hh代表unsigned char
这里uint8_t, 8bit就用hhx就行了。
===Sample2==========================================================================================================================
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)
warning的原因应该是因为字节长度不匹配。
可以用其他变量中转,%02x只是告诉sscanf取buffer数据时取两个字节就结束,但是写入mm_mac必定会写入4个字节,这样会覆盖后面的内容。
这个代码实在是不安全,如果是big-endian的话,你说数据存储到哪里去了?应该写成%02hhx(编译器需支持这个标准的C99)。