这是我的第一个问题,如果我弄错了,请原谅我。
我对编程很新,我遇到了一个我无法找到在线解决方案的问题。当使用scanf
作为整数时,如果我的输入以一个或两个零开始,在某些情况下它将在其他系统中读取它(甚至不是二进制)。
例如,0020
将变为16
,0030
将变为24
,0100
将变为64
。
似乎适用于8
的权限,并考虑最多8
的数字(键入0009
将导致其打印0
然后9
)。
可能有一条我不知道的简单规则,如果答案显而易见,我很抱歉。提前感谢任何回答的人!
答案 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}}读取数字,那么它正在读取八进制数并将其解释为整数