Qual é a diferença entre os especificadores de conversão %i e %d em funções IO formatadas (*printf / *scanf)
-
19-09-2019 - |
Pergunta
Qual é a diferença entre %d
e %i
quando usado como especificadores de formato em printf
?
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.