строка форматирования scanf для шестнадцатеричного кода с тире

Я пытаюсь написать функцию C для анализа ввода MAC-адреса с пробелами, двоеточиями или тире в качестве разделителей. Я пытался использовать %*[-:] для сопоставления нескольких символов, но, похоже, он не может обнаружить символ пробела (например, пробел), а также выдает неправильные значения с тире, поскольку думает, что числа отрицательный.

Моя функция выглядит примерно так:

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

Возможно ли это за один сканф? Или есть другие лучшие способы? Спасибо.


person Adam M-W    schedule 15.04.2011    source источник
comment
Если бы это был я, я бы, наверное, написал несколько дополнительных строк, чтобы превратить тире и пробелы в :, а затем написал одно простое правило sscanf(3).   -  person sarnold    schedule 15.04.2011


Ответы (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
person Mat    schedule 15.04.2011