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

#c #hex #scanf #format-specifiers

#c #шестнадцатеричный #scanf #спецификаторы формата

Вопрос:

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

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

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

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

Комментарии:

1. На моем месте я бы, вероятно, написал несколько дополнительных строк, чтобы превратить тире и пробелы в : , а затем написал одно простое sscanf(3) правило.

Ответ №1:

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

 #include <stdio.h>

int main()
{
    unsigned a;
    while (scanf("x%*[-: ]", amp;a) == 1) {
        fprintf(stdout, "xn", 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("x%*[-: t]x%*[-: t]x%*[:-]", amp;a, amp;b, amp;c) == 3) {
        fprintf(stdout, "x x xn", a, b, c);
    }
    return 0;
}
  

Который выдает это для приведенного выше ввода:

 a0 b1 01
ff b0 55