当前面的0时,Scanf读取错误的整数

时间:2016-12-01 08:39:23

标签: c++ codeblocks scanf

这是我的第一个问题,如果我弄错了,请原谅我。 我对编程很新,我遇到了一个我无法找到在线解决方案的问题。当使用scanf作为整数时,如果我的输入以一个或两个零开始,在某些情况下它将在其他系统中读取它(甚至不是二进制)。 例如,0020将变为160030将变为240100将变为64

似乎适用于8的权限,并考虑最多8的数字(键入0009将导致其打印0然后9 )。

可能有一条我不知道的简单规则,如果答案显而易见,我很抱歉。提前感谢任何回答的人!

2 个答案:

答案 0 :(得分:4)

scanf的文档说明了格式字符i ...

  

i匹配可选的有符号整数;下一个指针必须是                 指向int的指针。如果开始,则在基数16中读取整数                 带有0x或0X,如果以0开头,则为8,基数为10                 除此以外。只有对应于基数的字符                 使用

如果您想强制读取十进制整数,请使用格式说明符d

  

d匹配可选的带符号十进制整数;下一个指针必须是指向int的指针。

所以我想这就是你所拥有的:

int value;
int n = scanf( "%i", &value );

将其更改为:

int value;
int n = scanf( "%d", &value );

答案 1 :(得分:1)

流行的基地(基础8,10和16)有不同的符号。

Base 8:也称为Octal。将0放在输入数字前面时,可以将数字定义为基数8。因此,当您输入020时,它将以小数形式显示为16

基础10:也称为十进制。您只需编写一个您想要输入的数字,而不需要任何前导0。因此,当您输入20时,它会被视为20

Base 16:也称为十六进制。你用前面的0x写它。因此输入0x20时,它将以小数形式存储为32

如果您使用格式说明符为{s> scanf() %d的{​​{1}}读取数字,那么它正在读取八进制数并将其解释为整数