Ответ 1
Правильный способ - использовать inttypes.h
, который определяет стандартные макросы для семейства printf
и семейства scanf
, например
printf ("%" PRId16, short_int);
scanf ("%" SCNd16, &short_int);
Считывая этот вопрос SO, я начал задаваться вопросом - какой правильный способ использовать scanf
/printf
(и семейство ) с фиксированными размерами?
Например, если у меня есть short int
или int
, я бы использовал %hd
и %d
соответственно - штраф.
Но что, если у меня есть int16_t
? short int
может отличаться от int16_t
, зависит от платформы. То же самое для любых других фиксированных (интегральных) типов?
ПРИМЕЧАНИЕ.. Похоже, что я получил несколько голосов, потому что я "не пытался Google это", похоже, мне нужно объяснить: я не видел подобного вопроса вот, почему я его разместил. На большинство вопросов в SO можно было ответить с помощью Google, а не спрашивать здесь. Это сделало бы StackOverflow не тем местом, на котором он сейчас находится.
И НЕТ, я не делал этого для репутации - я уже сегодня попал в повседневную репутацию (с 24 голосами перед отправкой этого вопроса).
Моя точка зрения - я не думаю, что это заслуживает понижения голосов.
Правильный способ - использовать inttypes.h
, который определяет стандартные макросы для семейства printf
и семейства scanf
, например
printf ("%" PRId16, short_int);
scanf ("%" SCNd16, &short_int);
Заголовок inttypes.h содержит макросы, которые определяют правильные спецификаторы формата для целых чисел фиксированной ширины, определенных в stdint.h. Например, спецификатор типа для printf()
и int16_t
- это макрос с именем PRId16
. Пример:
int16_t x;
scanf("%" SCNd16, &x);
printf("You have entered: %" PRId16 "\n", x);