Eu tenho o seguinte programa
#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;
}
Que quando compilado usando gcc filename.c
emitiu o seguinte aviso (na scanf()
linha).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
Em seguida, o referido C99 specification - 7.19.6 Formatted input/output functions
e não poderia compreender o especificador de formato correcto quando se utiliza os modificadores de comprimento (como short
, long
, etc.) com unsigned
para int
tipo de dados.
O %u
especificador correto é unsigned short int
? Se sim, por que estou recebendo o aviso acima mencionado ?!
Edição: Na maioria das vezes, eu estava tentando %uh
e ainda estava dando o aviso.
printf("%u\n", (unsigned int)length); //
sempre funciona, uma vez que o C99 especificação você lê garante quesizeof(short) <= sizeof(int)
(mas as respostas reais a esta pergunta abaixo são, naturalmente, muito mais agradável)Respostas:
Tente usar o
"%h"
modificador:fonte
Para
scanf
, você precisa usar%hu
desde que você está passando um ponteiro para umunsigned short
. Paraprintf
, é impossível passar umunsigned short
por inadimplência promoções (que será promovido paraint
ouunsigned int
dependendo seint
tem pelo menos tantos bits de valor, comounsigned short
ou não), de modo%d
ou%u
está bem. Você é livre para usar,%hu
se preferir.fonte
Na página de manual do Linux:
Portanto, para imprimir um número inteiro curto não assinado, a string de formato deve ser
"%hu"
.fonte
Aqui está uma boa tabela para
printf
especificadores. Então deve ser%hu
paraunsigned short int
.E link para Wikipedia "tipos de dados C" também.
fonte