Apa perbedaan antara penentu konversi% i dan% d dalam fungsi IO yang diformat (* printf / * scanf)

Jawaban:

276

Mereka sama ketika digunakan untuk output, misalnya dengan printf.

Namun, ini berbeda ketika digunakan sebagai input specifier misalnya dengan scanf, di mana %dmemindai bilangan bulat sebagai angka desimal yang ditandatangani, tetapi secara %idefault menjadi desimal tetapi juga memungkinkan heksadesimal (jika didahului oleh 0x) dan oktal (jika didahului oleh 0).

Jadi 033akan dengan 27 %itetapi dengan 33 %d.

Dipstick
sumber
8
Mengharapkan int dengan kemungkinan zero-padding di sscanf menurut saya merupakan perilaku default yang paling masuk akal. Jika Anda tidak mengharapkan Octal, itu dapat menyebabkan bug halus. Jadi ini menunjukkan bahwa% d adalah specifier yang baik untuk digunakan ketika Anda harus memilih satu secara sewenang-wenang, kecuali jika Anda secara eksplisit ingin membaca oktal dan / atau hex.
Eliot
2
Ah! Itu masuk akal! Sekarang saya tahu apa yang harus dicari, ini juga dapat dilihat pada dokumentasi untuk printfdan scanf.
Gabriel Staples
67

Ini identik untuk printftetapi berbeda untuk scanf. Untuk printf, keduanya %ddan %imenunjuk bilangan bulat desimal yang ditandatangani. For scanf, %ddan %ijuga berarti bilangan bulat bertanda tetapi %imemasukkan input sebagai angka heksadesimal jika didahului oleh 0xdan oktal jika didahului oleh 0dan menafsirkan input sebagai desimal.

jason
sumber
20

Tidak ada perbedaan antara penspesifikasi format %idan %duntuk printf. Kita bisa melihat ini dengan pergi ke standar rancangan C99 Bagian 7.19.6.1 Fungsi fprintf yang juga mencakup printfsehubungan dengan format specifiers dan mengatakan dalam ayat 8 :

Penentu konversi dan artinya adalah:

dan termasuk peluru berikut:

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.

Di sisi lain untuk scanfperbedaan, %dasumsikan basis 10 sementara %iotomatis mendeteksi basis. Kita dapat melihat ini dengan masuk ke bagian 7.19.6.2 Fungsi fscanf yang mencakup scanfsehubungan dengan format specifier, dalam paragraf 12 dikatakan:

Penentu konversi dan artinya adalah:

dan termasuk yang berikut ini:

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

Tidak ada di printf- keduanya sinonim.

SS Anne
sumber
6
Ada perbedaan ketika digunakan dalam scanf()format string seperti jawaban yang diterima mengatakan.
J ... S