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

202

Qual é a diferença entre %de %iquando usado como especificadores de formato printf?

Ayoub M.
fonte

Respostas:

276

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 entrada, por exemplo scanf, with , onde %dvarre um número inteiro como um número decimal assinado, mas o %ipadrão é decimal, mas também permite hexadecimal (se precedido por 0x) e octal (se precedido por 0).

Então 033seria 27 com %imas 33 com %d.

Vareta de nível
fonte
8
Esperar um int com possível zero-padding no sscanf me parece ser o comportamento padrão mais razoável. Se você não está esperando Octal, isso pode causar erros sutis. Portanto, isso sugere que% d é um bom especificador para usar quando você tiver que escolher um arbitrariamente, a menos que deseje explicitamente ler octal e / ou hex.
Eliot
2
Ah! Isso faz sentido! Agora que sei o que procurar, isso também pode ser visto na documentação de printfe scanf.
Gabriel Staples
67

Estes são idênticos para, printfmas diferentes para scanf. Para printf, ambos %de %idesigne um número inteiro decimal assinado. Por scanf, %de %itambém significa um inteiro assinado mas %iinteprets a entrada como um número hexadecimal se precedido por 0xe octal se precedido por 0e de outra forma como interpreta a entrada decimal.

Jason
fonte
20

Não há diferença entre os especificadores %ie %dformato para printf. Podemos ver isso indo para a seção preliminar do padrão C99 7.19.6.1 A função fprintf, que também abrange os printfespecificadores 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, pois scanfhá uma diferença, %dassuma a base 10 enquanto %ia detecção automática é feita. Podemos ver isso indo para a seção 7.19.6.2 A função fscanf, que aborda scanfem 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.
Shafik Yaghmour
fonte
4

Não há nenhum printf- os dois são sinônimos.

SS Anne
fonte
6
Há uma diferença quando usada na scanf()string de formato, como diz a resposta aceita.
J ... S