Quelle est la différence entre les spécificateurs de conversion% i et% d dans les fonctions IO formatées (* printf / * scanf)

Quelle est la différence entre %d et %i lorsqu’il est utilisé comme spécificateur de format dans printf ?

Ils sont identiques pour la sortie, par exemple avec printf .

Cependant, elles sont différentes lorsqu’elles sont utilisées comme spécificateur d’entrée, par exemple avec scanf , où %d parsing un nombre entier en tant que nombre décimal signé, mais %i défaut en décimal mais autorise également hexadécimal (s’il est précédé de 0x ) et octal s’il est précédé de 0 .

Donc 033 serait 27 avec %i mais 33 avec %d .

Celles-ci sont identiques pour printf mais différentes pour scanf . Pour printf , %d et %i désignent un entier décimal signé. Pour scanf , %d et %i signifie également un entier signé mais %i interprète l’entrée comme un nombre hexadécimal si elle est précédée de 0x et octal si elle est précédée de 0 et si elle interprète autrement l’entrée comme décimale.

Il n’y a pas de différence entre les spécificateurs de format %i et %d pour printf . Nous pouvons le voir en allant dans la section 7.19.6.1 norme standard C99 La fonction 7.19.6.1 qui couvre également printf qui concerne les spécificateurs de format et indique au paragraphe 8 :

Les spécificateurs de conversion et leur signification sont les suivants:

et comprend la puce suivante:

 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. 

Par contre, pour scanf il y a une différence, %d suppose que la base 10 et %i détecte automatiquement la base. Nous pouvons le voir en allant à la section 7.19.6.2 La fonction fscanf qui couvre scanf par rapport au spécificateur de format, au paragraphe 12, elle dit:

Les spécificateurs de conversion et leur signification sont les suivants:

et comprend les éléments suivants:

 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. 

Il n’y en a pas dans ces mots – les deux sont des synonymes.