Pregunta

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]
    }     
}

cuando el usuario introduce "023919" El procedimiento devuelve 19.
esta es una característica o la oscuridad es una norma?

¿Fue útil?

Solución

En realidad, eso se debe a que ha introducido un número octal .

En C, los números que empiezan con 0 se interpretará como octal literales (base-8). Por lo tanto, en su entrada

023919

scanf encontrar un cero sin un x siguiente, por lo que asume que es un número octal. Luego se consume 2 y 3, hasta 9 que no es un dígito octal válido y se detiene. Así scanf tiene ahora

023

que es

2*8 + 3 = 19

Así que el procedimiento devuelve 19.


Utilice la %d formato en lugar de %i para evitar esto.

Otros consejos

Es lo mismo si se ha utilizado scanf directamente (sin montaje en línea). "023" es la representación octal de 19, y scanf se detiene en la "9" en "0239", porque eso no puede ser un dígito octal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top