Qual è l'identificatore di formato per int senza abbreviato int?


124

Ho il seguente programma

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

Che una volta compilato utilizzando ha gcc filename.cemesso il seguente avviso (nella scanf()riga).

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

Ho poi fatto riferimento la C99 specification - 7.19.6 Formatted input/output functionse non riuscivo a capire l'identificatore di formato corretto quando si utilizza i modificatori di lunghezza (come short, long, ecc) con unsignedper intil tipo di dati.

%uLo specificatore è corretto unsigned short int? In caso affermativo, perché ricevo l'avviso di cui sopra ?!

EDIT: Il più delle volte, ci stavo provando %uhe continuava a dare l'avvertimento.


2
printf("%u\n", (unsigned int)length); //funziona sempre, poiché le specifiche C99 che leggi garantiscono che sizeof(short) <= sizeof(int)(ma le risposte effettive a questa domanda qui sotto sono ovviamente molto più belle)
Philip

1
Non c'è bisogno del cast; le promozioni predefinite se ne occupano.
R .. GitHub FERMA DI AIUTARE ICE

Risposte:


155

Prova a usare il "%h"modificatore:

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

ISO / IEC 9899: 201x - 7.21.6.1-7

Specifica che un seguente identificatore di conversione d, i, o, u, x, X o n si applica a un argomento con puntatore di tipo breve o non firmato .


47

Per scanf, è necessario utilizzare %hupoiché si passa un puntatore a un unsigned short. Per printf, è impossibile passare un a unsigned shortcausa di promozioni predefinite (sarà promosso into a unsigned intseconda che intabbia almeno tanti bit di valore unsigned shorto meno) così %do %uva bene. %huSe preferisci, sei libero di usarlo .


7

Dalla pagina del manuale di Linux:

h Una seguente conversione di numero intero corrisponde a un argomento int breve o senza int breve oppure a una
       la conversione n lowing corrisponde a un puntatore a un argomento int breve.

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


Non credo sia così che "stampi" short ints perché vengono automaticamente promossi in ints (proprio come i caratteri).
Alexey Frunze,

2
@Alex% hu /% hd in printf funziona. Era% hhu /% hhd disponibile solo a partire da C99. % h e% hh implicano a & 0xFFFF resp. & 0xFF sull'intero passato.
jørgensen,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.