web-dev-qa-db-ja.com

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

printfの形式指定子として使用する場合、%d%iの違いは何ですか?

189
Ayoub M.

出力に使用する場合は同じです。 printfで。

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

したがって、033%iでは27ですが、%dでは33です。

261
Dipstick

これらはprintfでは同じですが、scanfでは異なります。 printfの場合、%d%iの両方が符号付き10進整数を指定します。 scanfの場合、%dおよび%iも符号付き整数を意味しますが、%iは、0xが先行する場合は16進数として解釈し、0が先行する場合は8進数で解釈します。

67
jason

printf%i%dのフォーマット指定子に違いはありません。これは、 ドラフト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.
19
Shafik Yaghmour

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

5
anon