2010-08-27 9 views
5

Ok, quindi ho qualche problema con gli iostream di C++ che sembra molto strano, ma probabilmente è un comportamento definito, considerando che questo accade sia con MSVC++ sia con G ++.Perché l'overflow dei numeri interi causa errori negli iostream di C++?

Dire che ho questo programma:

#include <iostream> 
using namespace std; 

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

    return 0; 
} 

Se ho volutamente troppo pieno, dando il primo cin un valore che è maggiore del limite massimo di un int, tutte le ulteriori chiamate a cin.operator>>() ritorna immediatamente per qualche motivo e a è impostato su un valore. Il valore sembra essere indefinito.

Perché e dove viene documentato questo comportamento? C'è un modo per capire se si è verificato un tale overflow?

Inoltre, questo programma simile sembra funzionare come intendo. Se esagero il valore, darà un valore a a e continuerà come se l'overflow non fosse mai successo.

#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; 
} 

risposta

7

iostreams è stato progettato per rilevare gli errori e inserire uno stato di errore. Si ottiene lo stesso risultato dall'overflow dei numeri interi dall'inserimento di una stringa non numerica.

Trasmettere cin (o qualsiasi flusso) a bool o controllare cin.rdstate() per determinare se si è verificato un errore.

Chiama cin.clear() e cin.ignore() per eliminare l'errore. Raccoglierà sul punto dei personaggi che hanno fallito.

Per quanto riguarda la documentazione ufficiale, lo standard sfortunatamente diventa un po 'imperscrutabile nelle viscere degli iostreams. Vedere §27.6.1.2.1, 27.6.1.2.2 e 22.2.2.1.1/11 (non scherzo):

- scanf La sequenza di caratteri accumulato nella fase 2 avrebbe causato per segnalare un ingresso fallimento. ios_base :: failbit è assegnato a err.

Il documentation for scanf è altrettanto impenetrabile, e proverò con fede che l'overflow dovrebbe essere un errore.

1

Penso che cin si stia impostando su uno stato di errore a causa della lettura non valida.

La prima risposta qui lo spiega.

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

appena provato questo codice e se sembra essere l'impostazione di fallire stato

#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 inizia con un valore non definito. Non è la colpa di cin. Prova:

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

sarà verificare se la lettura in a riuscito prima di utilizzare a

Problemi correlati