2009-12-12 31 views

Respuesta

216

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

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

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

+4

Supongo que esperar un int con posible relleno en sscanf es el comportamiento predeterminado más razonable.Si no estás esperando Octal, eso podría causar errores sutiles. Entonces, esto sugiere que% d es un buen especificador para usar cuando tiene que elegir uno arbitrariamente, a menos que explícitamente quiera leer octal y/o hexadecimal. – Eliot

9

No hay ninguna en esas palabras - los dos son sinónimos.

+0

Hay una diferencia cuando se usa en la cadena de formato 'scanf()' como dice la respuesta aceptada. –

62

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 va precedido de 0x y octal si va precedido por 0 y de lo contrario interpreta la entrada como decimal.

14

No hay diferencia entre los especificadores de formato %i y %d para printf. Podemos ver esto de ir a la sección de draft C99 standard7.19.6.1La función fprintf que también cubre printf con respecto a los especificadores de formato y se dice en el párrafo :

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 existe una diferencia, %d asume la base 10, mientras que %i detecta automáticamente la base. Podemos ver esto de ir a la sección 7.19.6.2La función fscanf que cubre scanf con respecto al especificador de formato, en el párrafo 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. 
Cuestiones relacionadas