web-dev-qa-db-fra.com

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?

189
Ayoub M.

Ils sont identiques lorsqu'ils sont utilisés pour la sortie, par ex. avec printf.

Cependant, ils sont différents lorsqu'ils sont utilisés en tant que spécificateur d'entrée, par ex. avec scanf, où %d numérise un entier sous la forme d'un nombre décimal signé, mais %i par défaut, mais autorise également hexadécimal (si précédé de 0x) et octal (si précédé). par 0).

Donc, 033 aurait 27 ans avec %i mais 33 avec %d.

261
Dipstick

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

67
jason

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 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 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 assume la base 10 alors que %i détecte automatiquement la base. Nous pouvons le voir en allant à la section 7.19.6.2 La fonction fscanf qui couvre scanf en ce qui concerne le spécificateur de format, dans le paragraphe 12 il est écrit:

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.
19
Shafik Yaghmour

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

5
anon