Я не знаю, насколько это портативно, или точно ли оно соответствует вашим требованиям.
#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