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

Правильный способ использования scanf/printf (и семейства) с фиксированными размерами?

Считывая этот вопрос SO, я начал задаваться вопросом - какой правильный способ использовать scanf/printf (и семейство ) с фиксированными размерами?

Например, если у меня есть short int или int, я бы использовал %hd и %d соответственно - штраф.

Но что, если у меня есть int16_t? short int может отличаться от int16_t, зависит от платформы. То же самое для любых других фиксированных (интегральных) типов?


ПРИМЕЧАНИЕ.. Похоже, что я получил несколько голосов, потому что я "не пытался Google это", похоже, мне нужно объяснить: я не видел подобного вопроса вот, почему я его разместил. На большинство вопросов в SO можно было ответить с помощью Google, а не спрашивать здесь. Это сделало бы StackOverflow не тем местом, на котором он сейчас находится.

И НЕТ, я не делал этого для репутации - я уже сегодня попал в повседневную репутацию (с 24 голосами перед отправкой этого вопроса).

Моя точка зрения - я не думаю, что это заслуживает понижения голосов.

4b9b3361

Ответ 1

Правильный способ - использовать inttypes.h, который определяет стандартные макросы для семейства printf и семейства scanf, например

printf ("%" PRId16, short_int);
scanf ("%" SCNd16, &short_int);

Ответ 2

Заголовок inttypes.h содержит макросы, которые определяют правильные спецификаторы формата для целых чисел фиксированной ширины, определенных в stdint.h. Например, спецификатор типа для printf() и int16_t - это макрос с именем PRId16. Пример:

int16_t x;
scanf("%" SCNd16, &x);

printf("You have entered: %" PRId16 "\n", x);