2010-08-27 33 views
5

Ok, entonces tengo algunos problemas con los iostreams de C++ que se sienten muy raros, pero probablemente es un comportamiento definido, considerando que esto ocurre tanto con MSVC++ como con G ++.¿Por qué el desbordamiento de enteros causa errores con iostreams en C++?

Decir que tengo este programa:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    cout << a << endl; 
    cin >> a; 
    cout << a << endl; 

    return 0; 
} 

Si intencionalmente desbordamiento dando el primer cin un valor que es mayor que el límite máximo de un int, todas las llamadas adicionales a cin.operator>>() a volver de inmediato por alguna razón y a se establece en algún valor. El valor parece ser indefinido.

¿Por qué y dónde se documenta este comportamiento? ¿Hay alguna manera de averiguar si ocurrió un desbordamiento?

Además, este programa similar parece funcionar como me propongo. Si desbordo el valor, dará algún valor a a y continuará como si el desbordamiento nunca ocurriera.

#include <cstdio> 
using namespace std; 

int main() 
{ 
    int a; 
    scanf("%d", &a); 
    printf("%d\n", a); 
    scanf("%d", &a); 
    printf("%d\n", a); 
    scanf("%d", &a); 
    printf("%d\n", a); 

    return 0; 
} 

Respuesta

7

iostreams está diseñado para detectar errores y entrar en un estado de error. Obtiene el mismo resultado del desbordamiento de enteros que al ingresar una cadena no numérica.

Transmitir cin (o cualquier secuencia) a bool o consultar cin.rdstate() para determinar si se ha producido un error.

Llame cin.clear() y cin.ignore() para solucionar el error. Se retomará en el punto de los personajes que fallaron.

En cuanto a la documentación oficial, el estándar lamentablemente se vuelve un tanto inescrutable en las entrañas de iostreams. Ver §27.6.1.2.1, 27.6.1.2.2 y 22.2.2.1.1/11 (no es broma):

- scanf La secuencia de caracteres acumulado en la etapa 2 habría causado que informe una entrada fracaso. ios_base :: failbit está asignado a err.

El documentation for scanf es igual de impenetrable, y lo haré con la convicción de que el desbordamiento se supone que es un error.

1

Creo que cin se está estableciendo a un estado de error debido a la lectura no válida.

La primera respuesta aquí lo explica.

http://www.dreamincode.net/forums/topic/93200-cin-checking-and-resetting-error-state/

sólo trató este código y que parece ser el establecimiento de fallar estado

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    if(!cin) 
    { 
     cin.clear(); 
    } 
    cout << a << endl; 
    cin >> a; 
    if(!cin) 
    { 
     cin.clear(); 
    } 
    cout << a << endl; 

    return 0; 
} 
0

a comienza con un valor indefinido. No es culpa de cin. Proveedores:

if (cin >> a) { 
    cout << a endl; 
} 

Se comprobará si la lectura en a sucedió antes de usar a

Cuestiones relacionadas