В чем разница между спецификаторами преобразования% 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назначьте десятичное целое число со знаком. For 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