¿Cuál es la diferencia entre especificadores de conversión% i y% d en funciones IO con formato (* printf / * scanf)
-
19-09-2019 - |
Pregunta
¿Cuál es la diferencia entre %d
y %i
cuando se utiliza como especificadores de formato en printf
?
Solución
Ellos son los mismos cuando se utiliza para la salida, por ejemplo, con printf
.
Sin embargo, éstos son diferentes cuando se utiliza como entrada de especificador por ejemplo con scanf
, donde %d
escanea un número entero como un número decimal firmado, pero los valores predeterminados %i
a decimal sino que también permite hexadecimal (si precedida por 0x
) y octal (si precedido por 0
).
Así 033
sería 27 con %i
pero con 33 %d
.
Otros consejos
Estos son idénticos para printf
pero diferente para scanf
. Para printf
, tanto %d
y %i
designan un número entero decimal firmado. Para scanf
, %d
y %i
también significa un número entero firmado pero %i
inteprets la entrada como un número hexadecimal si precedido por 0x
y octal si precedido por 0
y de otra manera interpreta la entrada como decimal.
No hay ninguna diferencia entre los especificadores de formato y %i
%d
para printf
. Podemos ver esto de ir a la proyecto de norma C99 7.19.6.1
sección La función fprintf que también cubre printf
con respecto a los especificadores de formato y se dice en el párrafo 8
Los especificadores de conversión y sus significados son:
e incluye la siguiente bala:
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
asumir base 10, mientras que %i
automático detecta la base. Podemos ver esto de ir 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 que 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 cualquiera está en printf
- los dos son sinónimos