Qual è la differenza tra gli indicatori di conversione% ie% d nelle funzioni formattati IO (* printf / scanf *)
-
19-09-2019 - |
Domanda
Qual è la differenza tra %d
e %i
quando viene utilizzato come identificatori di formato in printf
?
Soluzione
Sono lo stesso quando usato per l'uscita, per esempio con printf
.
Tuttavia, questi sono diverse quando utilizzati come specificatore esempio con scanf
, dove %d
analizza un intero come un numero decimale firmato, ma di default %i
a decimale, ma permette anche esadecimale (se preceduto da 0x
) e ottale (se preceduto da 0
).
Quindi 033
sarebbe 27 con %i
ma 33 con %d
.
Altri suggerimenti
Questi sono identici per printf
ma diversi per scanf
. Per printf
, sia %d
e %i
designano un intero decimale firmata. 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.
Non v'è alcuna differenza tra i %i
e format %d
specificazioni per printf
. Possiamo vedere questo andando al C99 standard 7.19.6.1
sezione La funzione fprintf che copre anche printf
rispetto alle identificatori di formato e si dice nel paragrafo 8 :
Gli indicatori di conversione e il loro significato sono:
e include il seguente 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 base 10 mentre auto %i
rileva la base. Possiamo vedere questo andando alla sezione 7.19.6.2
La funzione fscanf che copre scanf
rispetto al di formato, al punto 12 che 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.
Non c'è alcuna in printf
- i due sono sinonimi