为什么scanf结果与用户输入不同?

时间:2010-02-14 13:33:05

标签: c++ inline-assembly

char* ReadNumericFormat = "%i";
int Read(void)
{
    int Storage;
    __asm
    {
        LEA    EAX, [Storage]
        PUSH   EAX
        PUSH   DWORD PTR [ReadNumericFormat]
        CALL   DWORD PTR [scanf]
        ADD    ESP, 8
        MOV    EAX, DWORD PTR [Storage]
    }     
}

当用户输入“023919”时,程序返回19.
这是一个功能还是黑暗是一个标准?

2 个答案:

答案 0 :(得分:8)

实际上那是因为您输入了八进制数

在C中,以0开头的数字将被解释为八进制(base-8)文字。因此,在您的输入

023919

scanf找到一个前导零而没有x跟随,所以假设它是一个八进制数。然后它消耗23,直到9,这不是有效的八进制数字并停止。所以scanf现在有

023

2*8 + 3 = 19

所以程序返回19。


使用格式%d代替%i来阻止此操作。

答案 1 :(得分:1)

如果您直接使用scanf(没有内联汇编),则相同。 “023”是19的八进制表示,scanf在“0239”中的“9”处停止,因为它不能是八进制数字。