146 votes

Quel est le spécificateur de format pour unsigned short int ?

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, lorsqu'il est compilé avec gcc filename.c a émis l'avertissement suivant (dans le scanf() ligne).

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

J'ai ensuite renvoyé le C99 specification - 7.19.6 Formatted input/output functions et ne pouvait pas comprendre le spécificateur de format correct lors de l'utilisation des modificateurs de longueur (tels que short , long etc.) avec unsigned pour int type de données.

Est %u 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 il donnait toujours l'alerte.

2 votes

printf("%u\n", (unsigned int)length); // fonctionne toujours, puisque la spécification C99 que vous avez lue garantit que sizeof(short) <= sizeof(int) (mais les réponses réelles à cette question ci-dessous sont bien sûr beaucoup plus agréables)

1 votes

Pas besoin du casting, les promotions par défaut s'en chargent.

180voto

cnicutar Points 98451

Essayez d'utiliser le "%h" modificateur :

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 d , i , o , u , x , X , ou n. suivant s'applique à un argument de type pointeur vers un court ou court non signé .

56voto

R.. Points 93718

Pour scanf vous devez utiliser %hu puisque vous passez un pointeur à un fichier unsigned short . Pour printf il est impossible de faire passer un unsigned short en raison des promotions par défaut (il sera promu à la catégorie int ou unsigned int selon que int a au moins autant de bits de valeur que unsigned short ou pas) donc %d ou %u est bien. Vous êtes libre d'utiliser %hu si vous préférez, cependant.

12voto

nos Points 102226

%u s'attend à un int non signé, donc ce n'est pas correct. Vous pouvez utiliser le h pour indiquer qu'il s'agit d'un court-circuit. Utilisez donc %hu .

h Indique que la conversion sera l'une des deux options suivantes : d i o u x X ou n et le pointeur suivant est un pointeur vers un short int ou unsigned short int (plutôt que int).

10voto

Joachim Pileborg Points 121221

Depuis la page du manuel 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.

Ainsi, pour imprimer un entier court non signé, la chaîne de format devrait être "%hu" .

1 votes

Je ne pense pas que ce soit la façon dont on "printf" les ints courts car ils sont automatiquement promus en ints (tout comme les chars).

3 votes

@Alex %hu/%hd dans printf fonctionne. C'était %hhu/%hhd qui n'est disponible qu'à partir de C99. %h et %hh impliquent un &0xFFFF resp. &0xFF sur l'entier passé.

7voto

foo bar Points 747

Voici un bonne table pour printf spécificateurs. Il devrait donc être %hu pour unsigned short int .

Et lien vers Wikipédia "Types de données en C aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X