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, lors de la compilation avec gcc filename.c
, a émis l'avertissement suivant (dans la ligne scanf()
).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
J'ai ensuite fait référence à C99 specification - 7.19.6 Formatted input/output functions
et je ne pouvais pas comprendre le spécificateur de format correct lors de l'utilisation des modificateurs de longueur (tels que short
, long
, etc.) avec unsigned
pour le type de données int
.
%u
est-il le spécificateur 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.
Essayez d’utiliser le modificateur "%h"
:
scanf("%hu", &length);
^
ISO/IEC 9899: 201x - 7.21.6.1-7
Spécifie qu'un spécificateur de conversion d, i, o, u, x, X ou n suivant s'applique à un argument de type pointeur sur short ou unsigned short.
Pour scanf
, vous devez utiliser %hu
car vous passez un pointeur sur un unsigned short
. Pour printf
, il est impossible de passer un unsigned short
en raison de promotions par défaut (il sera promu à int
ou unsigned int
selon que int
a au moins la valeur beaucoup de bits de valeur comme unsigned short
ou pas) donc %d
ou %u
va bien. Vous êtes libre d'utiliser %hu
si vous préférez, cependant.
De la page de manuel Linux:
h Une conversion entière suivante correspond à un argument entier court ou entier non signé, ou à une conversion f.
Donc, pour imprimer un entier court non signé, la chaîne de format doit être "%hu"
.
Voici un bonne table pour les spécificateurs printf
. Donc, cela devrait être %hu
pour unsigned short int
.
Et lien vers Wikipedia "types de données C" aussi.