В чем разница между спецификаторами преобразования %i и %d в форматированных функциях ввода-вывода (*printf / *scanf)
-
19-09-2019 - |
Вопрос
В чем разница между %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
- эти два понятия - синонимы.