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

StackOverflow https://stackoverflow.com/questions/1893490

Вопрос

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

Это было полезно?

Решение

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

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

Итак 033 было бы 27 с %i но 33 с %d.

Другие советы

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

Нет никакой разницы между %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.

В нем нет ничего подобного printf - эти два понятия - синонимы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top