Подтвердить что ты не робот

Спецификаторы формата для uint8_t, uint16_t,...?

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

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

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

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

4b9b3361

Ответ 1

Они объявлены в <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, я для соответствующего спецификатора, затем ничего, LEAST, FAST, MAX, а затем размер (очевидно, для размера МАКСИМУМ). Некоторые другие примеры: PRIo8, PRIuMAX, SCNoFAST16.

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

Ответ 2

Как говорили другие, включите заголовок <stdint.h>, который определяет макросы формата. Однако на С++ определите __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

Ответ 3

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

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

<any_type> x;
f >> x;

и сделаем. Например:.

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Обратитесь к this для использования sscanf.

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

Шаш