web-dev-qa-db-fra.com

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, 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.

113

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.

145
cnicutar

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.

45
R..

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".

6

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.

2
foo bar