Яка різниця між специфікаторами перетворення% i та% d у форматованих функціях вводу-виводу (* printf / * scanf)


Відповіді:


276

Вони однакові при використанні для виведення, наприклад, з printf.

Однак вони відрізняються, коли вони використовуються як вхідний специфікатор, наприклад, з scanf, де %dсканує ціле число у вигляді підписаного десяткового числа, але %iза замовчуванням на десяткове, але також допускається шістнадцятковий (якщо передує 0x) та восьмеричний (якщо передує 0).

Так 033було б 27, %iале 33 с %d.


8
Очікування int з можливим зануленням нуля в sscanf здається мені найбільш розумною поведінкою за замовчуванням. Якщо ви не очікуєте Octal, це може спричинити непомітні помилки. Отже, це говорить про те, що% d є хорошим специфікатором, який потрібно використовувати, коли доводиться вибирати його довільно, за винятком випадків, коли ви прямо не хочете читати восьмеричні та / або шістнадцяткові.
Еліот

2
Ах! Що має сенс! Тепер, коли я знаю, на що звернути увагу, це також можна побачити в документації на printfта scanf.
Габріель Степлес

67

Вони однакові для, printfале різні для scanf. Для printfобох %dі %iпозначте підписане десяткове ціле число. Для scanf, %dа %iтакож означає підписане ціле число, але %iвводить вхід як шістнадцяткове число, якщо йому передує, 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- обидва є синонімами.


6
Існує різниця, коли використовується у scanf()рядку формату, як говорить прийнята відповідь.
J ... S
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.