#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