Что такое спецификатор формата для unsigned short int?
У меня есть следующая программа
#include <stdio.h>
int main(void)
{
unsigned short int length = 10;
printf("Enter length : ");
scanf("%u", &length);
printf("value is %u \n", length);
return 0;
}
Что при компиляции с использованием gcc filename.c
выдается следующее предупреждение (в строке scanf()
).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
Затем я ссылался на C99 specification - 7.19.6 Formatted input/output functions
и не мог понять правильный спецификатор формата при использовании модификаторов длины (например, short
, long
и т.д.) с типом unsigned
для int
.
Является %u
правильным спецификатором unsigned short int
? Если да, то почему я получаю вышеупомянутое предупреждение?!
EDIT:
Большую часть времени я пытался %uh
, и он все еще выдавал предупреждение.
Ответы
Ответ 1
Попробуйте использовать модификатор "%h"
:
scanf("%hu", &length);
^
ISO/IEC 9899: 201x - 7.21.6.1-7
Указывает, что следующие преобразования d, i, o, u, x, X или n specifier применяется к аргументу с типом указателем на короткий или unsigned short.
Ответ 2
Для scanf
вам нужно использовать %hu
, поскольку вы передаете указатель на unsigned short
. Для printf
невозможно выполнить unsigned short
из-за промо-акций по умолчанию (ему будет присвоено значение int
или unsigned int
в зависимости от того, имеет ли int
как минимум столько битов значения, сколько unsigned short
или нет) поэтому %d
или %u
в порядке. Вы можете использовать %hu
, если хотите.
Ответ 3
На странице руководства Linux:
h A following integer conversion corresponds to a short int or unsigned short int argument, or a fol‐
lowing n conversion corresponds to a pointer to a short int argument.
Итак, чтобы напечатать короткое целое без знака, строка формата должна быть "%hu"
.