Sscanf с шестнадцатеричными значениями - PullRequest
0 голосов
/ 05 марта 2019

Я должен разобрать массив символов в c ++, который имеет шестнадцатеричные значения:

char test[20] = ":CF0100020003000400";

Из теста мне нужно получить 0200 (512), 0300 (768) и 0400 (1024). Я хочу сохранить эти значения в типе uint16_t.

uint16_t value1;
uint16_t value2;
uint16_t value3;
sscanf(test, ":CF%*04x%04x%04x%04x", (int *)&value1, (int *)&value2, (int *)&value3);

Я получил только последнее значение (value3 = 1024), но value1 и value2 равны 0. Однако, если переменные имеют тип int, без приведения, sscanf работает нормально. I Как я могу это исправить?

1 Ответ

4 голосов
/ 05 марта 2019

Ваш кастинг и выбор неверного спецификатора формата вызывает неопределенное поведение.Используйте правильные спецификаторы формата в соответствии с типом переменной:

std::sscanf(test, ":CF%04" SCNx16 "%04" SCNx16 "%04" SCNx16,
                      &value1,     &value2,     &value3);
...