scanf格式化字符串为带有破折号的十六进制

时间:2011-04-15 06:06:05

标签: c hex scanf format-specifiers

我正在尝试编写一个C函数来解析MAC地址输入,其中空格,冒号或破折号作为分隔符。我一直在研究使用%*[-:]来匹配多个字符,但它似乎无法检测到空白字符(例如空格),并且它还会产生错误的值,因为它的思想是数字是负数。

我的功能类似于:

scanf("%2x%*[-:]%2x", &hex1, &hex2);

是否可以在一个scanf中?还是有其他更好的方法吗?感谢。

1 个答案:

答案 0 :(得分:1)

我不知道这是多么便携,或者它是否完全符合您的要求。

#include <stdio.h>

int main()
{
    unsigned a;
    while (scanf("%02x%*[-: ]", &a) == 1) {
        fprintf(stdout, "%02x\n", a);
    }
    return 0;
}

使用此输入(第一个十六进制数后面的选项卡,最后一个前面的空格):

a0  b1-01:ff-:-b0 55

它产生这个输出:

a0
b1
01
ff
b0
55

如果您在同一个调用中需要多个项目,请尝试一些变体(将空格或制表符作为分隔符):

#include <stdio.h>

int main()
{
    unsigned a,b,c;
    while (scanf("%02x%*[-: \t]%02x%*[-: \t]%02x%*[:-]", &a, &b, &c) == 3) {
        fprintf(stdout, "%02x %02x %02x\n", a, b, c);
    }
    return 0;
}

这为上述输入提供了这个:

a0 b1 01
ff b0 55