猿问

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

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

%d%i用作格式说明符的区别是什么printf



拉风的咖菲猫
浏览 1057回答 3
3回答

繁星coding

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

侃侃无极

%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函数覆盖scanf相对于格式说明,在第12这样说的:转换说明符及其含义是:并包括以下内容: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.

忽然笑

在我看来,在sscanf中可能出现零填充的int似乎是最合理的默认行为。如果你不期待Octal,那可能会导致微妙的错误。所以这表明%d是一个很好的说明符,当你必须任意选择一个时,除非你明确想要读取八进制和/或十六进制。
随时随地看视频慕课网APP
我要回答