строка форматирования scanf для шестнадцатеричных с тире - PullRequest
2 голосов
/ 15 апреля 2011

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

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

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

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

1 Ответ

1 голос
/ 15 апреля 2011

Я не знаю, насколько это портативно, или точно ли оно соответствует вашим требованиям.

#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
...