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

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

4 ответов


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

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

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


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

в этих словах нет ничего-эти два являются синонимами.