Cuál es la diferencia entre los especificadores de conversión% i y% d en las funciones IO formateadas (* printf / * scanf)

¿Cuál es la diferencia entre %d y %i cuando se utilizan como especificadores de formato en printf ?

Son los mismos cuando se utilizan para la salida, por ejemplo, con printf .

Sin embargo, estos son diferentes cuando se usan como especificador de entrada, p. Ej. Con scanf , donde %d escanea un entero como un número decimal con signo, pero %i predeterminado a decimal pero también permite hexadecimal (si está precedido por 0x ) y octal si está precedido por 0 .

Entonces 033 sería 27 con %i pero 33 con %d .

Estos son idénticos para printf pero diferentes para scanf . Para printf , tanto %d como %i designan un entero decimal con signo. Para scanf , %d y %i también significa un entero con signo, pero %i interpreta la entrada como un número hexadecimal si está precedido por 0x y octal si está precedido por 0 y de otro modo interpreta la entrada como decimal.

No hay diferencia entre los especificadores de formato %i y %d para printf . Podemos ver esto yendo al borrador de la sección estándar de C99 7.19.6.1 La función fprintf que también cubre printf con respecto a los especificadores de formato y dice en el párrafo 8 :

Los especificadores de conversión y sus significados son:

e incluye la siguiente viñeta:

 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. 

Por otro lado, para scanf hay una diferencia, %d supone base 10 mientras que %i detecta automáticamente la base. Podemos ver esto yendo a la sección 7.19.6.2 La función fscanf que cubre scanf con respecto al especificador de formato, en el párrafo 12 dice:

Los especificadores de conversión y sus significados son:

e incluye lo siguiente:

 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. 

No hay ninguno en esas palabras, los dos son sinónimos.