Спецификаторы формата для uint8 t, uint16 t,...?

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

sscanf (line, "Value of integer: %dn", &my_integer);

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

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

6 ответов


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

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


как говорили другие, включают в себя <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

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

В общем, я серьезно recommemend вместо использования потоков:

<any_type> x;
f >> x;

и было сделано. Например:

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

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


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

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


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


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

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

Шаш