Qual é a diferença entre os especificadores de conversão% i e% d em funções de E / S formatadas (* printf / * scanf)

Qual é a diferença entre %d %i quando usado como especificadores de formato no printf ?

Eles são os mesmos quando usados ​​para saída, por exemplo, com printf .

No entanto, elas são diferentes quando usadas como especificador de input, por exemplo, com scanf , onde %d varre um inteiro como um número decimal sinalizado, mas %i é decimal, mas também permite hexadecimal (se precedido por 0x ) e octal se precedido por 0 .

Então 033 seria 27 com %i mas 33 com %d .

Estes são idênticos para printf mas diferentes para scanf . Para printf , %d e %i designam um inteiro decimal com sinal. Para scanf , %d e %i também significa um inteiro assinado, mas %i interpreta a input como um número hexadecimal se precedido por 0x e octal se precedido por 0 e, de outro modo, interpreta a input como decimal.

Não há diferença entre os especificadores de formato %i e %d para printf . Podemos ver isso indo para o rascunho da seção padrão C99 7.19.6.1 A function fprintf que também cobre printf com relação aos especificadores de formato e diz no parágrafo 8 :

Os especificadores de conversão e seus significados são:

e inclui o seguinte marcador:

 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 outro lado, para scanf existe uma diferença, %d assume base 10 enquanto %i detecta automaticamente a base. Podemos ver isso indo para a seção 7.19.6.2 A function fscanf que cobre o scanf com respeito ao especificador de formato, no parágrafo 12 diz:

Os especificadores de conversão e seus significados são:

e inclui o seguinte:

 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. 

Não há nenhuma dessas palavras – os dois são sinônimos.