J'ai le programme suivant
#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;
}
Qui, une fois compilé en utilisant, a gcc filename.c
émis l'avertissement suivant (dans la scanf()
ligne).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
Mentionnant la C99 specification - 7.19.6 Formatted input/output functions
et ne pouvait pas comprendre le spécificateur de format correct lorsque vous utilisez les modificateurs de longueur (comme short
, long
, etc.) avec unsigned
pour le int
type de données.
Le %u
spécificateur est -il correct unsigned short int
? Si oui, pourquoi est-ce que je reçois l'avertissement mentionné ci-dessus?!
EDIT: La plupart du temps, j'essayais %uh
et cela donnait toujours l'avertissement.
printf("%u\n", (unsigned int)length); //
fonctionne toujours, puisque la spécification C99 que vous lisez garantit quesizeof(short) <= sizeof(int)
(mais les réponses réelles à cette question ci-dessous sont bien sûr beaucoup plus agréables)Réponses:
Essayez d'utiliser le
"%h"
modificateur:la source
Pour
scanf
, vous devez utiliser%hu
puisque vous passez un pointeur vers un fichierunsigned short
. Carprintf
, il est impossible de passer ununsigned short
dû aux promotions par défaut (il sera promuint
ouunsigned int
selon qu'ilint
a au moins autant de bits de valeur queunsigned short
ou non) alors%d
ou%u
c'est bien. Vous êtes cependant libre d'utiliser%hu
si vous préférez.la source
Depuis la page de manuel Linux:
Donc, pour imprimer un entier court non signé, la chaîne de format doit être
"%hu"
.la source
Voici un bon tableau pour les
printf
prescripteurs. Donc ça devrait être%hu
pourunsigned short int
.Et lien vers Wikipedia "types de données C" aussi.
la source