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

実際には、 8 進数を入力したためです。

C では、0 で始まる数値は 8 進数 (基数 8) のリテラルとして解釈されます。したがって、あなたの入力で

023919

scanf次のない先行ゼロを見つけるためx、8進数であると想定します。次に、有効な 8 進数でなくなるまで2andを消費して停止します。だから今持っている39scanf

023

これは

2*8 + 3 = 19

したがって、プロシージャは 19 を返します。


これを防ぐには、%d代わりに形式を使用してください。%i

于 2010-02-14T13:39:18.770 に答える
1

scanf直接 (インライン アセンブリなしで)使用した場合も同じです。"023" は 19 の 8 進表現であり、scanf は "0239" の "9" で停止します。これは 8 進数字ではないためです。

于 2010-02-14T13:39:53.653 に答える