2012-01-02 10 views
90

Ho il seguente programma diQual è l'identificatore di formato per unsigned short int?

#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; 
} 

Quali quando compilati utilizzando gcc filename.c ha emesso il seguente avviso (in linea scanf()).

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

Poi cui il C99 specification - 7.19.6 Formatted input/output functions e non poteva capire l'identificatore di formato corretto quando si utilizzano i modificatori di lunghezza (come short, long, ecc) con unsigned per int tipo di dati.

È %u l'identificatore corretto unsigned short int? In tal caso, perché ricevo l'avviso sopra menzionato ?!

MODIFICA: La maggior parte del tempo, stavo provando %uh e stava ancora dando l'avvertimento.

+2

'printf ("% u \ n ", lunghezza (unsigned int)); // 'funziona sempre, poiché la specifica C99 che leggi garantisce che' sizeof (short) <= sizeof (int) '(ma le risposte effettive a questa domanda sotto sono ovviamente molto più belle) – Philip

+1

Non c'è bisogno del cast; le promozioni predefinite si prendono cura di esso. –

risposta

118

Provare a utilizzare il modificatore di "%h":

scanf("%hu", &length); 
     ^

ISO/IEC 9899: 201x - 7.21.6.1-7

Specifica che un seguito d, i, o, u, x, X , o n lo specificatore di conversione si applica a un argomento con il puntatore del tipo short o short senza firma.

+0

Documentazione sorgente, per favore? – sergiol

+1

@sergiol Ho aggiunto la fonte. – cnicutar

6

Dalla pagina di manuale di 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. 

Quindi, per stampare un breve intero senza segno, la stringa di formato deve essere "%hu".

+0

Non penso che questo sia il modo in cui si "stampano" brevemente perché vengono automaticamente promossi in int (come i caratteri). –

+2

@Alex% hu /% hd in printf funziona. Era% hhu /% hhd che è disponibile solo a partire da C99. % h e% hh implicano a & 0xFFFF resp. & 0xFF sul numero intero passato. –

+0

@ jørgensen: hai ragione, è nello standard. –

36

Per scanf, è necessario utilizzare %hu poiché si passa un puntatore a un unsigned short. Per printf, è impossibile passare un unsigned short causa promozioni predefinite (sarà promosso int o unsigned int seconda che int presenta almeno tanti bit di valore come unsigned short o meno) in modo %d o %u va bene. Sei libero di usare %hu se preferisci, comunque.

+6

+1 per menzionare le promozioni predefinite in 'printf()'. Grazie! –

Problemi correlati