2012-10-17 23 views
14

Lettura this SO question, ho iniziato a chiedermi: qual è il modo corretto di utilizzare scanf/printf (e famiglia) con tipi di dimensioni fisse?Modo corretto per utilizzare scanf/printf (e famiglia) con tipi di dimensioni fisse?

Per esempio, se ho short int o int, mi piacerebbe usare %hd e %d rispettivamente - bene.

Ma cosa succede se ho int16_t? short int potrebbe essere diverso da int16_t, dipende dalla piattaforma. Lo stesso per qualsiasi altro tipo (integrale) di dimensioni fisse?


NOTA: Come sembra che ho ricevuto alcuni down-voti, perché "non ho cercato di google questo", sembra che ho bisogno di spiegare: non ho vedi una domanda simile qui, è per questo che l'ho postato. La maggior parte delle domande in SO avrebbe potuto essere risolta usando Google, invece di chiedere qui. Ciò renderebbe StackOverflow non il luogo, che in realtà è ora.

E NO, non l'ho fatto per la reputazione - Ho già raggiunto il limite della reputazione giornaliera oggi (con 24 voti prima di pubblicare questa domanda).

Il mio punto è: non credo che questo meriti voti negativi.

+1

Non dimenticare di utilizzare il tuo buon amico google. ;) Ti ha dato un colpo durante la ricerca: ["printf int16_t"] (https://www.google.com/#hl=en&output=search&sclient=psy-ab&q=printf+int16_t&oq=printf+int16_t&gs_l=hp.3. ..741.1861.0.2073.8.7.0.0.0.0.267.267.2-1.1.0.les% 3B..0.0 ... 1c.1.7MPX56CVufA & PBX = 1 & BAV = on.2, or.r_gc.r_pw.r_cp.r_qf. & fp = ec63c9d2be74365f & BPCL = 35.277.026 & biw = 1343 & BiH = 748). – Mike

+0

@Mike - Non ho :) Penso che sarebbe bello avere una domanda simile qui (e no, non a causa della reputazione - ho già raggiunto il limite della reputazione giornaliera di oggi (con 24 voti fino a ora)). Non penso che questo meriti voti. –

+0

+1 Concorda con la tua modifica. Grazie per il chiarimento. – Mike

risposta

13

Il modo corretto è quello di utilizzare inttypes.h che definisce macro standard per printf famiglia e la scanf famiglia, ad esempio

printf ("%" PRId16, short_int); 
scanf ("%" SCNd16, &short_int); 
+0

Cool, grazie :) +1 e accettato. –

+0

Perché è meglio di '% d'? Il corto non sarebbe convertito in 'int'? –

4

Il file di intestazione inttypes.h contiene macro che definiscono gli specificatori di formato corretti per interi a larghezza fissa definiti in stdint.h. Ad esempio, l'identificatore di tipo per printf() e int16_t è la macro denominata PRId16. Esempio:

int16_t x; 
scanf("%" SCNd16, &x); 

printf("You have entered: %" PRId16 "\n", x); 
+1

Le macro non includono il carattere iniziale '%' richiesto. –

+0

@ Steve-o risolto. –

Problemi correlati