0
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。
这是一个特征还是黑暗是一个标准?

4

2 回答 2

8

实际上那是因为你输入了一个八进制数

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

023919

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

023

这是

2*8 + 3 = 19

所以程序返回 19。


使用格式%d而不是%i防止这种情况发生。

于 2010-02-14T13:39:18.770 回答
1

如果你scanf直接使用(没有内联汇编)也是一样的。“023”是 19 的八进制表示,而 scanf 在“0239”中的“9”处停止,因为那不能是八进制数字。

于 2010-02-14T13:39:53.653 回答