it-swarm.com.ru

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

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

185
Ayoub M.

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

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

Таким образом, 033 будет 27 с %i, но 33 с %d.

256
Dipstick

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

67
jason

Нет никакой разницы между спецификаторами формата %i и %d для printf. Это можно увидеть, перейдя в раздел черновик стандарта C997.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.
19
Shafik Yaghmour

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

5
anon