214

%d在和%i中用作格式说明符printf和有什么区别scanf

4

4 回答 4

299

它们在用于输出时是相同的,例如使用printf.

但是,当用作输入说明符时,这些是不同的,例如 with scanf,其中%d将整数扫描为带符号的十进制数,但%i默认为十进制,但也允许十六进制(如果前面有0x)和八进制(如果前面有0)。

03327 和%i33也是如此%d

于 2009-12-12T13:58:07.477 回答
71

这些对于 相同printf但对于 不同scanf。对于printf,两者%d%i指定一个有符号十进制整数。对于scanf,%d%i也表示有符号整数,但%i如果前面有则将输入解释为十六进制数,如果前面有0x八进制数,则将0输入解释为十进制。

于 2009-12-12T13:53:20.057 回答
20

%i的和%d格式说明符之间没有区别printf。我们可以通过C99 标准草案7.19.6.1 的 fprintf 函数看到这一点,该函数也涵盖printf了格式说明符,它在第8段中说:

转换说明符及其含义是:

并包括以下项目符号:

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.

另一方面,由于scanf存在差异,%d假设基数为 10,而%i自动检测基数。我们可以通过转到关于格式说明符7.19.6.2 的 fscanf 函数部分来看到这一点,在第12段中它说:scanf

转换说明符及其含义是:

并包括以下内容:

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.
于 2014-08-28T20:07:53.793 回答
3

没有任何内容printf-两者是同义词。

于 2009-12-12T13:52:02.197 回答