Что такое спецификатор формата для unsigned short int? - PullRequest
112 голосов
/ 02 января 2012

У меня есть следующая программа

#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, и он все еще давал предупреждение.

Ответы [ 4 ]

143 голосов
/ 02 января 2012

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

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

ИСО / МЭК 9899: 201x - 7.21.6.1-7

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

45 голосов
/ 02 января 2012

Для scanf необходимо использовать %hu, поскольку вы передаете указатель на unsigned short. Для printf невозможно передать unsigned short из-за повышений по умолчанию (он будет повышен до int или unsigned int в зависимости от того, имеет ли int столько же битов значения, сколько unsigned short или нет) так что %d или %u в порядке. Вы можете использовать %hu, если хотите, однако.

6 голосов
/ 02 января 2012

На странице руководства 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".

2 голосов
/ 01 марта 2018

Вот хорошая таблица для printf спецификаторов. Так должно быть %hu для unsigned short int.

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

...