What is the difference between conversion specifiers %i and %d in formatted IO functions (*printf / *scanf)
C++CPrintfScanfFormat SpecifiersC++ Problem Overview
What is the difference between %d
and %i
when used as format specifiers in printf
and scanf
?
C++ Solutions
Solution 1 - C++
They are the same when used for output, e.g. with printf
.
However, these are different when used as input specifier e.g. with scanf
, where %d
scans an integer as a signed decimal number, but %i
defaults to decimal but also allows hexadecimal (if preceded by 0x
) and octal (if preceded by 0
).
So 033
would be 27 with %i
but 33 with %d
.
Solution 2 - C++
These are identical for printf
but different for scanf
. For printf
, both %d
and %i
designate a signed decimal integer. For scanf
, %d
and %i
also means a signed integer but %i
inteprets the input as a hexadecimal number if preceded by 0x
and octal if preceded by 0
and otherwise interprets the input as decimal.
Solution 3 - C++
There is no difference between the %i
and %d
format specifiers for printf
. We can see this by going to the draft C99 standard section 7.19.6.1
The fprintf function which also covers printf
with respect to format specifiers and it says in paragraph 8:
> The conversion specifiers and their meanings are:
and includes the following bullet:
> > 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.
On the other hand for scanf
there is a difference, %d
assume base 10 while %i
auto detects the base. We can see this by going to section 7.19.6.2
The fscanf function which covers scanf
with respect to format specifier, in paragraph 12 it says:
> The conversion specifiers and their meanings are:
and includes the following:
> > 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.
Solution 4 - C++
There isn't any in printf
- the two are synonyms.