¿Por qué es diferente de resultados scanf entrada del usuario?
-
20-09-2019 - |
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?
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.