Qual è la differenza tra gli identificatori di conversione% i e% d nelle funzioni IO formattate (* printf / * scanf)


Risposte:


276

Sono gli stessi se utilizzati per l'output, ad es printf. Con .

Tuttavia, questi sono diversi se utilizzati come identificatore di input, ad esempio con scanf, dove %desegue la scansione di un numero intero come numero decimale con segno, ma il %ivalore predefinito è decimale ma consente anche esadecimale (se preceduto da 0x) e ottale (se preceduto da 0).

Quindi 033sarebbe 27 con %ima 33 con %d.


8
Aspettarmi un int con possibile zero-padding in sscanf mi sembra il comportamento di default più ragionevole. Se non ti aspetti Octal, ciò potrebbe causare bug sottili. Quindi questo suggerisce che% d è un buon identificatore da usare quando devi sceglierne uno arbitrariamente, a meno che tu non voglia esplicitamente leggere ottale e / o esadecimale.
Eliot,

2
Ah! Questo ha senso! Ora che so cosa cercare, questo può essere visto anche nella documentazione di printfe scanf.
Gabriel Staples,

67

Questi sono identici per printfma diversi per scanf. Per printf, sia %de %idesignare un intero decimale con segno. Perché scanf, %de %isignifica anche un numero intero con %isegno ma integra l'input come un numero esadecimale se preceduto da 0xe ottale se preceduto da 0e interpreta in altro modo l'input come decimale.


20

Non vi è alcuna differenza tra gli identificatori di formato %ie %dper printf. Possiamo vederlo andando alla bozza della sezione standard C99 7.19.6.1 La funzione fprintf che copre anche printfper quanto riguarda gli identificatori di formato e dice nel paragrafo 8 :

Gli identificatori di conversione e i loro significati sono:

e include il seguente punto elenco:

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 perché scanfc'è una differenza, %dsupponiamo che la base 10 %irilevi automaticamente la base. Possiamo vederlo andando alla sezione 7.19.6.2 La funzione fscanf che copre scanfrispetto allo specificatore di formato, al paragrafo 12 dice:

Gli identificatori di conversione e i loro significati 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.

4

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


6
C'è una differenza quando usato nella scanf()stringa di formato come dice la risposta accettata.
J ... S,
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.