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

Beh*_*ooz 0 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]
    }     
}
Run Code Online (Sandbox Code Playgroud)

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

ken*_*ytm 8

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

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

023919
Run Code Online (Sandbox Code Playgroud)

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

023
Run Code Online (Sandbox Code Playgroud)

是的

2*8 + 3 = 19
Run Code Online (Sandbox Code Playgroud)

所以程序返回19.


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