Что такое спецификатор формата для 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.

и ссылка на Википедию "типы данных C" тоже.