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

202

Quelle est la différence entre %det %ilorsqu'il est utilisé comme spécificateurs de format dans printf?

Ayoub M.
la source

Réponses:

276

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

Cependant, ceux-ci sont différents lorsqu'ils sont utilisés comme spécificateur d'entrée, par exemple avec scanf, où %dscanne un entier sous la forme d'un nombre décimal signé, mais par %idé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 , 033serait 27 avec , %imais 33 avec %d.

Jauge
la source
8
Attendre un int avec un éventuel zéro-padding dans sscanf me semble être le comportement par défaut le plus raisonnable. Si vous ne vous attendez pas à Octal, cela pourrait provoquer de subtils bugs. Cela suggère donc que% d est un bon spécificateur à utiliser lorsque vous devez en choisir un arbitrairement, sauf si vous voulez explicitement lire octal et / ou hex.
Eliot
2
Ah! Ça a du sens! Maintenant que je sais quoi rechercher, cela peut également être vu dans la documentation de printfet scanf.
Gabriel Staples
67

Ils sont identiques pour printfmais différents pour scanf. Pour printf, à la fois %det %idésigner un entier décimal signé. Pour scanf, %det %isignifie également un entier signé mais %iinterprète l'entrée comme un nombre hexadécimal si elle est précédée de 0xet octale si elle est précédée par 0et interprète autrement l'entrée comme décimale.

Jason
la source
20

Il n'y a aucune différence entre les spécificateurs de format %iet %dpour printf. Nous pouvons le voir en allant au projet de section standard C99 7.19.6.1 La fonction fprintf qui couvre également en ce qui printfconcerne les spécificateurs de format et il est dit au paragraphe 8 :

Les spécificateurs de conversion et leurs significations sont:

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.

D'un autre côté car scanfil y a une différence, %dsupposons la base 10 tandis que l' %iauto détecte la base. On peut le voir en allant à la section 7.19.6.2 La fonction fscanf qui couvre scanfen ce qui concerne spécificateur de format, au paragraphe 12 , il dit:

Les spécificateurs de conversion et leurs significations sont:

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.
Shafik Yaghmour
la source
4

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

SS Anne
la source
6
Il y a une différence lorsqu'il est utilisé dans une scanf()chaîne de format comme le dit la réponse acceptée.
J ... S