2016-12-01 32 views
0

这是我的第一个问题,所以如果我弄错了,请原谅我。 我对编程非常陌生,遇到了一个问题,我找不到在线解决方案。当使用scanf作为整数时,如果我的输入以一个或两个零开始,在某些情况下它会在其他系统中读取它(甚至不是二进制)。 例如,0020将变为160030将变为24,0100将变成64当前面0时,Scanf读取错误的整数

这似乎与8强国合作,并考虑数字高达8(打字0009将导致其打印0然后9)。

可能有一个我不知道的简单规则,如果答案很明显,我很抱歉。预先感谢任何回答的人!

+2

告诉我们代码 – JerryGoyal

+1

您应该发布您的代码示例以帮助我们理解 – cokceken

+0

[此'scanf'(和家庭)参考](http://en.cppreference.com/w/c/io/fscanf)应该有帮助。 –

回答

1

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

基地8:也被称为八度。当您在输入号码前加0时,可以将数字定义为基数8。所以当你输入020时,它被认为是十进制的16

基数10:也称为小数。你只需要输入一个你想输入的号码,而不需要任何前导码0。所以当你输入20时,它被认为是20

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

如果您正在阅读使用scanf()与格式说明符的数量%d%i,则读取一个八进制数,并将其解释为整数。

+0

'%d'总是意味着十进制(因此为“d”),它将忽略前导零并且永远不会转换为基数8. – Dai

+0

@Dai您说得对 –

4

scanf的文档指出格式字符i ...

i匹配是一个符号整数。下一个指针必须是 指向int的指针。如果以0x或0X开头的 ,则以16为基数读取整数;如果以0开头,则以8为底数读取整数;否则,以10为底数读取基地台数 。只有对应于基数的字符是 。

如果要强制读取十进制整数然后用格式说明d

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

所以我想这是你拥有的一切:

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

它改成这样:

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