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

Respuestas:

276

Ellos son los mismos cuando se utiliza para la salida, por ejemplo con printf.

Sin embargo, estos son diferentes cuando se usan como especificador de entrada, por ejemplo scanf, con , donde %descanea un número entero como un número decimal con signo, pero por %idefecto es decimal pero también permite hexadecimal (si está precedido por 0x) y octal (si está precedido por 0).

Entonces 033sería 27 con %ipero 33 con %d.

Varilla graduada
fuente
8
Esperar un int con posible relleno de cero en sscanf me parece el comportamiento predeterminado más razonable. Si no espera Octal, eso podría causar errores sutiles. Esto sugiere que% d es un buen especificador para usar cuando tiene que elegir uno arbitrariamente, a menos que desee explícitamente leer octal y / o hexadecimal.
Eliot
2
Ah! ¡Eso tiene sentido! Ahora que sé qué buscar, esto también se puede ver en la documentación para printfy scanf.
Gabriel Staples
67

Estos son idénticos para printfpero diferentes para scanf. Para printf, ambos %dy %idesignan un entero decimal con signo. For scanf, %dy %itambién significa un entero con signo, pero %iinterpreta la entrada como un número hexadecimal si está precedido por 0xy octal si está precedido por 0y de lo contrario interpreta la entrada como decimal.

jason
fuente
20

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

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, porque scanfhay una diferencia, %dasuma la base 10 mientras %iauto detecta la base. Podemos ver esto yendo a la sección 7.19.6.2 La función fscanf que cubre scanfcon 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.
Shafik Yaghmour
fuente
4

No hay ninguno en printf- los dos son sinónimos.

SS Anne
fuente
66
Hay una diferencia cuando se usa en scanf()formato de cadena como dice la respuesta aceptada.
J ... S