フォーマットされたIO関数の変換指定子%iと%dの違いは何ですか(* printf / * scanf)


回答:


276

出力に使用する場合、たとえばと同じprintfです。

ただし、これらは入力指定子として使用する場合とは異なります。たとえばscanf、は%d整数を符号付き10進数としてスキャンしますが、%iデフォルトでは10進数ですが、16進数(前に0x)と8進数(前に)も許可します0

したがって033、27の場合は%i33、の場合は33になり%dます。


8
sscanfでゼロパディングが可能なintを期待することは、最も合理的なデフォルトの動作であるように思えます。Octalを期待していない場合は、微妙なバグが発生する可能性があります。したがって、これは、明示的に8進数または16進数、あるいはその両方を読み取りたい場合を除き、任意に1つを選択する必要がある場合に%dが適切な指定子であることを示唆しています。
Eliot

2
ああ!それは理にかなっている!何を探すべきかがわかったので、これはprintfおよびのドキュメントでも確認できscanfます。
ガブリエルステープルズ2018年

67

これらはと同じですprintfが、では異なりscanfます。の場合printf、とは両方とも符号付き10進整数%d%i指定します。以下のためにscanf%dそして%iまた、符号付き整数しかし手段%iintepretsが先行場合は16進数の入力0xが先行場合オクタル0さもなければ小数として入力を解釈します。


20

%iとの%dフォーマット指定子に違いはありませんprintf。これは、C99標準ドラフトセクションに行くことで確認できます。フォーマット指定子に関してもカバーする7.19.6.1 fprintf関数printfは、段落8で述べています。

変換指定子とその意味は次のとおりです。

次の箇条書きが含まれています。

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.

一方scanf、違いがあるため、自動でベースを検出している%d間、ベースを10と想定し%iます。これは、書式指定子に関してカバーするセクション7.19.6.2 fscanf関数に行くことで確認できます。scanf段落12では次のように述べています。

変換指定子とその意味は次のとおりです。

以下が含まれます。

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.

4

何もありませんprintf-2つは同義語です。


6
scanf()受け入れられた答えが言うように、フォーマット文字列で使用すると違いがあります。
J ... S
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.