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

StackOverflow https://stackoverflow.com/questions/1893490

Pergunta

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

Foi útil?

Solução

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

No entanto, estes são diferentes quando usados ​​como especificador de entrada, por ex.com scanf, onde %d verifica um número inteiro como um número decimal com sinal, mas %i o padrão é decimal, mas também permite hexadecimal (se precedido por 0x) e octal (se precedido por 0).

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

Outras dicas

Estes são idênticos para printf mas diferente para scanf. Por printf, Ambas %d e %i Designe um número inteiro decimal assinado. Por scanf, %d e %i também significa um número inteiro assinado, mas %i intere a entrada como um número hexadecimal se precedido por 0x e octal se precedido por 0 e, de outra forma, interpreta a entrada como decimal.

Não há diferença entre o %i e %d Especificadores de formato para printf. Podemos ver isso indo para o Rascunho do padrão C99 seção 7.19.6.1 A função 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 a seguinte 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 outro lado para scanf Há uma diferença, %d assuma a base 10 enquanto %i Auto detecta a base. Podemos ver isso indo para a seção 7.19.6.2 A função FScanf que cobre scanf Com relação 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á nenhum em printf - Os dois são sinônimos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top