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

В чем разница между %d и %i при использовании в качестве спецификаторов формата в printf и scanf?


person Ayoub M.    schedule 12.12.2009    source источник


Ответы (4)


Они такие же, когда используются для вывода, например с printf.

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

Итак, 033 будет 27 с %i, но 33 с %d.

person Dipstick    schedule 12.12.2009
comment
Ожидание int с возможным нулевым заполнением в sscanf кажется мне наиболее разумным поведением по умолчанию. Если вы не ожидаете Octal, это может вызвать небольшие ошибки. Таким образом, это говорит о том, что% d - хороший спецификатор для использования, когда вам нужно выбрать один произвольно, если вы явно не хотите читать восьмеричное и / или шестнадцатеричное. - person Eliot; 07.09.2013
comment
Ах! В этом есть смысл! Теперь, когда я знаю, что искать, это также можно увидеть в документации по _1 _ и scanf. - person Gabriel Staples; 08.11.2018
comment
Восьмеричная штука однажды укусила меня в Javascript. (некоторое числовое значение из базы данных изначально было в строковой форме с ведущими нулями). Человека, которого надо было выследить. - person Scott Smith; 13.01.2021

Они идентичны для printf, но разные для scanf. Для printf оба %d и %i обозначают десятичное целое число со знаком. Для scanf, %d и %i также означает целое число со знаком, но %i интерпретирует ввод как шестнадцатеричное число, если ему предшествует 0x, и восьмеричное, если ему предшествует 0, а в противном случае интерпретирует ввод как десятичный.

person jason    schedule 12.12.2009

Нет разницы между описателями формата %i и %d для printf. Мы можем убедиться в этом, перейдя к проекту стандарта C99 section 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.
person Shafik Yaghmour    schedule 28.08.2014

В printf их нет - это два синонима.

person Community    schedule 12.12.2009
comment
В принятом ответе есть разница при использовании в строке формата scanf(). - person J...S; 16.02.2018