Спецификаторы формата для 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.
Они объявлены в <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 связанный вопрос спросил, почему этот метод был использован. Вы можете найти ответы на интересные вопросы.
Как говорили другие, включите заголовок <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
Связанные вопросы
Похожие вопросы
Согласно 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.
В C заголовок <inttypes.h>
и форматы, такие как SCNX8, SCNd16.
Тот же заголовок, вероятно, также работает и для С++.
Правильный формат для чтения uint64_t
(typedef unsigned long long int) с scanf
, а не sscanf
, "%" SCNu64
и для печати также SCNu64
Пример. в вашем коде вы читаете, например, переменную my_integer, тогда вы делаете
scanf ("Value of integer:%" SCNu64, & my_integer);
и написать то же самое, но с помощью printf.
Обратитесь к this для использования sscanf.
Эти типы данных определены в stdint.h. Обратитесь здесь для stdint.h
Шаш
Посмотрите другие вопросы по меткам c++ c++11 scanf или Задайте вопрос