【发布时间】:2014-09-15 05:26:11
【问题描述】:
我正在尝试使用 sscanf 解析 mac 地址。这是我的尝试:
uint8_t mac[6];
//string version of mac address stored in s
if(strlen(s) == 17 && sscanf(s,
"%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
&mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6)
{ /*the mac address was parsed correctly*/ }
这适用于00:00:00:00:00:00 之类的常见情况,但它将地址00:00:00:00:0:123 解析为00:00:00:00:00:12。
sscanf 可以处理这种情况,还是我必须手动解析字符串?
编辑:格式应该完全是“xx:xx:xx:xx:xx:xx”。如果一个字节只能容纳一个字符,则必须使用前导零写入。
【问题讨论】:
-
由于您为每个组件指定 2 个字符,因此每个组件最多扫描 2 个字符。您希望它在输入更多字符时做什么?
-
我希望它准确读取 2 个字符,必要时以 0 开头。
-
如果您希望它最多读取两个字符,那么
00:00:00:00:0:123会不会不正确?确实,我马上就知道这是一个不正确的 MAC 地址。 -
正如您现在发现的那样,
scanf(和家人)并不适合解析和验证字符串,仅用于从字符串中提取值。您需要想出另一种解析和验证字符串的方法,例如带有strtoul的strtok循环来解析和检查数字。