【问题标题】:scanf formatting string for hex with dashes带有破折号的十六进制的scanf格式字符串
【发布时间】:2011-08-06 02:09:15
【问题描述】:

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

我的函数看起来像:

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

一个scanf可以吗?或者还有其他更好的方法吗?谢谢。

【问题讨论】:

  • 如果是我,我可能会多写几行,把破折号和空格变成:,然后写一个简单的sscanf(3) 规则。

标签: c hex scanf format-specifiers


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2022-07-08
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多