Спецификаторы формата для uint8_t, uint16_t, ...? - PullRequest
53 голосов
/ 09 августа 2011

Если у меня есть целочисленная переменная, я могу использовать sscanf, как показано ниже, используя спецификатор формата% d.

sscanf (line, "Value of integer: %d\n", &my_integer);

Где найти спецификаторы формата для uint8_t, uint16_t,uint32_t и uint64_t?

uint64_t имеет, вероятно,% lu.

Ответы [ 6 ]

84 голосов
/ 09 августа 2011

Они объявлены в <inttypes.h> как макросы: SCNd8, SCNd16, SCNd32 и SCNd64. Пример (для int32_t):

sscanf (line, "Value of integer: %" SCNd32 "\n", &my_integer);

Их формат: PRI (для printf) / SCN (для сканирования), затем o, u, x, X d, i для соответствующего спецификатора, затем ничего, LEAST, FAST, MAX, а затем размер (очевидно, что размер для МАКСИМУМ). Некоторые другие примеры: PRIo8, PRIuMAX, SCNoFAST16.

Редактировать: Кстати связанный вопрос спросил, почему этот метод был использован. Вы можете найти ответы интересными.

7 голосов
/ 09 августа 2011

Как уже говорили другие, включите заголовок <stdint.h>, который определяет формат макросов. В C ++, однако, определите __STDC_FORMAT_MACROS до его включения. Из stdint.h:

/* The ISO C99 standard specifies that these macros must only be
   defined if explicitly requested.  */
#if !defined __cplusplus || defined __STDC_FORMAT_MACROS
2 голосов
/ 09 августа 2011

Согласно 7.19.6 Отформатированные функции ввода / вывода из ИСО / МЭК 9899: TC2 , таких спецификаторов формата нет (поэтому я сомневаюсь, что они есть для C ++ 2003 ). Даже если в C99 есть некоторые # define-макросы, inttypes.h, cinttypes и inttypes.h не являются частью текущего стандарта. Конечно, целочисленные типы фиксированного размера также нестандартны.

В любом случае, я серьезно рекомендую использовать вместо этого потоки:

<any_type> x;
f >> x;

и будет сделано. E.g.:

std::stringstream ss;
uint32_t u;
std::cin >> u;

Это имеет то преимущество, что однажды в будущем изменение типа переменной не вызовет каскад скрытых ошибок и неопределенного поведения.

0 голосов
/ 08 мая 2016

Правильный формат для чтения uint64_t (typedef unsigned long long int), с scanf, а не sscanf, "%" SCNu64 и для печати также SCNu64 Пример.в вашем коде вы читаете, например, переменную my_integer, затем вы делаете scanf ("Value of integer:%" SCNu64, & my_integer); и пишете то же самое, но с использованием printf.

0 голосов
/ 09 августа 2011

В C заголовок <inttypes.h> и такие форматы, как SCNX8, SCNd16.

Тот же заголовок, вероятно, работает и для C ++.

0 голосов
/ 09 августа 2011

См. это для использования sscanf.

Эти типы данных определены в stdint.h. См. здесь для stdint.h

Шаша

...