格式化的IO函数(* printf / * scanf)中转换说明符%i和%d有什么区别


Answers:


276

它们用于输出时是相同的,例如与printf

但是,当用作输入说明符时,它们是不同的,例如与一起使用scanf,其中%d扫描一个整数作为有符号的十进制数字,但%i默认为十进制,但也允许十六进制(如果以开头0x)和八进制(如果以开头0)。

所以03327将与%i33一起%d


8
在我看来,期望sscanf中可能存在零填充的int似乎是最合理的默认行为。如果您不希望使用八进制,则可能会导致细微的错误。因此,这表明%d是您必须任意选择一个的很好的说明符,除非您明确想要读取八进制和/或十六进制。
艾略特2013年

2
啊! 这就说得通了!现在我知道要寻找什么,这也说明文档中可以看到printfscanf
加布里埃尔·斯台普斯

67

这些对相同,printf但对不同scanf。对于和printf,都指定一个带符号的十进制整数。为,并且也意味着带符号的整数,但inteprets如果前面由输入为十六进制数和八进制如果前面由否则解释输入为十进制。%d%iscanf%d%i%i0x0


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自动检测基数。我们可以从第127.19.6.2 的fscanf函数部分涉及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.

4

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


6
scanf()如接受的答案所述,在格式字符串中使用时有所不同。
J ... S
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.