225 votes

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 y %i lorsqu'ils sont utilisés comme spécificateurs de format dans printf y scanf ?

318voto

Dipstick Points 4869

Ils sont les mêmes lorsqu'ils sont utilisés pour la sortie, par exemple avec printf .

Cependant, ils sont différents lorsqu'ils sont utilisés comme spécificateur d'entrée, par exemple avec scanf , donde %d analyse un entier comme un nombre décimal signé, mais %i par défaut en décimal mais permet également l'hexadécimal (s'il est précédé de 0x ) et octal (s'il est précédé de 0 ).

Así que 033 serait de 27 avec %i mais 33 avec %d .

11 votes

S'attendre à un int avec une éventuelle mise à zéro dans sscanf me semble être le comportement par défaut le plus raisonnable. Si vous ne vous attendez pas à un Octal, cela pourrait causer des bugs subtils. Cela suggère donc que %d est un bon spécificateur à utiliser lorsque vous devez en choisir un arbitrairement, à moins que vous ne vouliez explicitement lire l'octal et/ou l'hexa.

2 votes

Ah ! C'est logique ! Maintenant que je sais ce qu'il faut chercher, on peut aussi voir cela dans la documentation de printf y scanf .

0 votes

Le truc de l'octal m'a piqué une fois en Javascript. (une valeur numérique de la base de données était initialement sous forme de chaîne avec des zéros en tête). C'était un problème à résoudre.

73voto

Jason Points 125291

Elles sont identiques pour printf mais différent pour scanf . Pour printf les deux %d y %i désigne un nombre entier décimal signé. Pour scanf , %d y %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 sinon interprète l'entrée en décimal.

22voto

Shafik Yaghmour Points 42198

Il n'y a pas de différence entre les %i y %d les spécificateurs de format pour printf . Nous pouvons voir cela en allant dans le projet de norme C99 section 7.19.6.1 La fonction fprintf qui couvre également printf en ce qui concerne les spécificateurs de format et il est dit dans le paragraphe 8 :

Les spécificateurs de conversion et leurs significations 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.

En revanche, pour scanf il y a une différence, %d suppose une base 10 tandis que %i détecte automatiquement la base. Nous pouvons voir cela en allant dans la section 7.19.6.2 La fonction fscanf qui couvre scanf en ce qui concerne le spécificateur de format, au paragraphe 12 il est dit :

Les spécificateurs de conversion et leurs significations 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.

3voto

Il n'y en a pas dans printf - les deux sont synonymes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X