Biçimlendirilmiş IO işlevlerinde% i ve% d dönüşüm belirteçleri arasındaki fark nedir (* printf / * scanf)


Yanıtlar:


278

Çıkış için kullanıldığında aynıdır, örneğin printf.

Bununla birlikte, bunlar giriş belirteci olarak kullanıldığında farklıdır, örneğin scanf, %dbir tamsayıyı işaretli ondalık sayı olarak tarar, ancak %ivarsayılan olarak ondalık sayıya sahiptir, ancak onaltılık (öncesinde gelirse 0x) ve sekizlik (öncesinde gelirse 0) sağlar.

Yani 03327 ile, %i33 ile olurdu %d.


9
Sscanf içinde olası sıfır dolgulu bir int beklemek bana en makul varsayılan davranış gibi görünüyor. Octal'ı beklemiyorsanız, bu ince hatalara neden olabilir. Bu, açıkça% sekizlik ve / veya onaltılık okumak istemediğiniz sürece,% d seçeneğinin rastgele seçmeniz gerektiğinde kullanmak için iyi bir belirleyici olduğunu gösterir.
Eliot

2
Ah! Mantıklı! Şimdi bu da belgelerinde görülebilir, ne aramak için biliyorum printfve scanf.
Gabriel Staples

67

Bunlar için aynı, printfancak için farklıdır scanf. İçin printf, hem %dve %iimzalı ondalık tamsayı belirler. İçin scanf, %dve %iayrıca imzalı tamsayı ama anlamı %iinteprets öncesinde eğer bir onaltılık sayı olarak girilmesi 0xöncesinde ve eğer sekizlik 0ve aksi ondalık olarak girdi yorumlar.


20

İçin %ive %dformat belirteçleri arasında fark yoktur printf. Biz giderek görebilirsiniz taslak C99 standart bölümünde 7.19.6.1 fprintf fonksiyonu da kapsar printfbiçim belirteçleri açısından ve paragrafta diyor 8 :

Dönüşüm belirteçleri ve anlamları:

ve aşağıdaki madde işaretini içerir:

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.

Öte yandan scanf, bir fark olduğu için, %dtabanı %iotomatik olarak algılarken taban 10'u varsayalım . Biz bölümüne giderek görebilirsiniz 7.19.6.2 fscanf fonksiyonunu kapsar scanfparagrafta biçim belirteci ile ilgili olarak, 12 şöyle der:

Dönüşüm belirteçleri ve anlamları:

ve aşağıdakileri içerir:

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

İçinde herhangi bir şey yok printf- ikisi eşanlamlıdır.


6
scanf()Biçim dizgisinde kabul edilen yanıtın belirttiği gibi kullanıldığında bir fark vardır .
J ... S
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.