Was ist der Unterschied zwischen den Konvertierungsspezifizierern% i und% d in formatierten E / A-Funktionen (* printf / * scanf)?

202

Was ist der Unterschied zwischen %dund %ibei Verwendung als Formatspezifizierer in printf?

Ayoub M.
quelle

Antworten:

276

Sie sind die gleichen, wenn sie für die Ausgabe verwendet werden, z printf. B. mit .

Diese unterscheiden sich jedoch, wenn sie als Eingabespezifizierer verwendet werden, z. B. mit scanf, wobei %deine Ganzzahl als vorzeichenbehaftete Dezimalzahl gescannt wird, der %iStandardwert jedoch dezimal ist, aber auch hexadezimal (wenn vorangestellt 0x) und oktal (falls vorangestellt 0) zulässig sind .

Also 033wäre 27 mit %iaber 33 mit %d.

Ölmessstab
quelle
8
Das Erwarten eines int mit möglichem Null-Auffüllen in sscanf scheint mir das vernünftigste Standardverhalten zu sein. Wenn Sie Octal nicht erwarten, kann dies zu subtilen Fehlern führen. Dies legt nahe, dass% d ein guter Bezeichner ist, wenn Sie einen willkürlich auswählen müssen, es sei denn, Sie möchten explizit Oktal und / oder Hex lesen.
Eliot
2
Ah! Das macht Sinn! Jetzt, da ich weiß, wonach ich suchen muss, ist dies auch in der Dokumentation für printfund zu sehen scanf.
Gabriel Staples
67

Diese sind identisch für, printfaber unterschiedlich für scanf. Für printfbeide %dund %ibezeichnen Sie eine vorzeichenbehaftete Dezimalzahl. Für scanf, %dund %ibedeutet auch eine vorzeichenbehaftete ganze Zahl , aber %iwenn der Eingang inteprets als Hexadezimalzahl mit vorangestellter 0xund oktalen wenn durch voran 0und ansonsten interpretiert die Eingabe als Dezimalzahl.

Jason
quelle
20

Es gibt keinen Unterschied zwischen den %iund %dFormatbezeichnern für printf. Wir können sehen , von dem Teilwert Entwurf C99 - Standard Abschnitt 7.19.6.1 Der fprintf Funktion , die auch deckt printfin Bezug auf Formatbezeich und es sagt in Absatz 8 :

Die Konvertierungsspezifizierer und ihre Bedeutungen sind:

und enthält die folgende Kugel:

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.

Wenn scanfes jedoch einen Unterschied gibt, %dnehmen Sie die Basis 10 an, während %idie Basis automatisch erkannt wird. Wir können dies sehen, indem wir zum Abschnitt 7.19.6.2 Die fscanf-Funktion gehen, die scanfin Bezug auf den Formatbezeichner behandelt wird. In Absatz 12 heißt es:

Die Konvertierungsspezifizierer und ihre Bedeutungen sind:

und umfasst Folgendes:

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
quelle
4

Es gibt keine in printf- die beiden sind Synonyme.

SS Anne
quelle
6
Es gibt einen Unterschied bei der Verwendung in scanf()Formatzeichenfolgen, wie in der akzeptierten Antwort angegeben.
J ... S