Что такое спецификатор формата для 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()
line).
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
, etc) с unsigned
на int
тип данных.
и %u
правильный спецификатор unsigned short int
? Если да, то почему я получаю вышеупомянутое предупреждение?!
изменить:
Большую часть времени я пытался %uh
и он все еще предупреждал.
4 ответов
попробуйте использовать "%h"
модификатор:
scanf("%hu", &length);
^
ISO / IEC 9899: 201x - 7.21.6.1-7
указывает, что следующее преобразование d , i , o , u , x , X или n спецификатор применяется к аргументу с типом указатель на короткий или unsigned short.
на scanf
, вы должны использовать %hu
так как вы передаете указатель на unsigned short
. Для printf
, невозможно пройти unsigned short
из-за промо-акций по умолчанию (он будет повышен до int
или unsigned int
в зависимости от int
имеет по крайней мере столько битов значения, сколько unsigned short
или нет) так %d
или %u
- это хорошо. Вы можете использовать %hu
Если вы предпочитаете, хотя.
на странице руководства 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"
.
здесь хороший стол на printf
спецификаторы. Так и должно быть %hu
на unsigned short int
.