2013-12-12 581 views

回答

-1

这是我考虑使用类似sscanf()来解析字符串的几个地方之一,因为MAC地址往往是格式化非常严格:

char str[] = "00:0d:3f:cd:02:5f"; 
uint8_t mac_addr[6]; 
if (sscanf(str, "%x:%x:%x:%x:%x:%x", 
      &mac_addr[0], 
      &mac_addr[1], 
      &mac_addr[2], 
      &mac_addr[3], 
      &mac_addr[4], 
      &mac_addr[5]) < 6) 
{ 
    fprintf(stderr, "could not parse %s\n", str); 
} 
+2

并不安全,并且将生成警告在某些编译器中,因为你传递了指向'uint8_t'的指针,这几乎肯定不像'sscanf()'期望的'int'宽。 – TypeIA

+0

好的,够公平的。 –

14
uint8_t bytes[6]; 
int values[6]; 
int i; 

if(6 == sscanf(mac, "%x:%x:%x:%x:%x:%x%*c", 
    &values[0], &values[1], &values[2], 
    &values[3], &values[4], &values[5])) 
{ 
    /* convert to uint8_t */ 
    for(i = 0; i < 6; ++i) 
     bytes[i] = (uint8_t) values[i]; 
} 

else 
{ 
    /* invalid mac */ 
} 

[编辑:在格式字符串的末尾添加%c输入拒绝多余的字符,基于d克鲁格的建议]

+3

您还可以在格式字符串的末尾添加%c,以确保在第六个八位字节后没有多余的字符。 –

+0

@Drueger谢谢,很好的建议......据此编辑。 – TypeIA

+2

根据Linux手册页,“如果格式中的转换规格数量超过了指针参数的数量,则结果未定义。”所以最好添加一个char指针作为sscanf的最后一个参数() – EdH