Что такое спецификатор формата для 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, etc) с unsigned на int тип данных.

и %u правильный спецификатор unsigned short int? Если да, то почему я получаю вышеупомянутое предупреждение?!

изменить: Большую часть времени я пытался %uh и он все еще давал предупреждение.

4 102

4 ответа:

попробуйте использовать "%h" модификатор:

scanf("%hu", &length);
        ^

ISO / IEC 9899: 201x-7.21.6.1-7

указывает , что следующее преобразование d , i , o , u , x , X или n спецификатор применяется к аргументу с типом указатель на короткий или беззнаковое короткое.

на 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.

и ссылка на Wikipedia "c data types" тоже.