2009-12-12 8 views

risposta

216

Sono uguali se utilizzati per la produzione, ad es. con printf.

Tuttavia, questi sono diversi se utilizzati come identificatori di ingresso, ad es. con scanf, dove %d esegue la scansione di un numero intero come numero decimale con segno, ma %i imposta il valore decimale ma consente anche esadecimale (se preceduto da 0x) e ottale se preceduto da 0.

Quindi 033 sarebbe 27 con %i ma 33 con %d.

+4

L'attesa di un int con possibile riempimento dello zero in sscanf mi sembra il comportamento predefinito più ragionevole.Se non ti aspetti Octal, ciò potrebbe causare bug sottili. Quindi questo suggerisce che% d è un buon specificatore da usare quando devi sceglierne uno arbitrariamente, a meno che tu non voglia esplicitamente leggere ottale e/o esadecimale. – Eliot

9

Non c'è nessuno in quelle parole - i due sono sinonimi.

+0

C'è una differenza quando usato nella stringa di formato 'scanf()' come dice la risposta accettata. –

62

Questi sono identici per printf ma diversi per scanf. Per printf, entrambi %d e %i indicano un numero decimale con segno. Per scanf, %d e %i significa anche un intero con segno ma %i inteprets l'ingresso come un numero esadecimale se preceduto da 0x e ottale se preceduta da 0 e altrimenti interpreta l'input come decimale.

14

Non v'è alcuna differenza tra i committenti e %i%d formato per printf. Possiamo vedere questo andando al draft C99 standard sezione 7.19.6.1La funzione fprintf che copre anche printf rispetto alle identificatori di formato e si dice al punto :

Gli indicatori di conversione e il loro significato sono:

e comprende le seguenti proiettile:

d,i  The int argument is converted to signed decimal in the style 
     [−]dddd. The precision specifies the minimum number of digits to 
     appear; if the value being converted can be represented in fewer 
     digits, it is expanded with leading zeros. The default precision is 
     1. The result of converting a zero value with a precision of zero is 
     no characters. 

D'altra parte per scanf c'è una differenza, %d assumere la base 10 mentre %i rileva automaticamente la base. Possiamo vedere questo andando alla sezione 7.19.6.2La funzione fscanf che copre scanf rispetto al di formato, al punto dice:

Gli indicatori di conversione e il loro significato sono:

e include quanto segue:

d  Matches an optionally signed decimal integer, whose format is the 
     same as expected for the subject sequence of the strtol function with 
     the value 10 for the base argument. The corresponding argument shall 
     be a pointer to signed integer. 

i  Matches an optionally signed integer, whose format is the same as 
     expected for the subject sequence of the strtol function with the 
     value 0 for the base argument. The corresponding argument shall be a 
     pointer to signed integer. 
Problemi correlati