2010-08-27 10 views
5

Ok, also habe ich einige Probleme mit C++ iostreams, die sich sehr seltsam anfühlen, aber es ist wahrscheinlich ein definiertes Verhalten, wenn man bedenkt, dass dies sowohl mit MSVC++ als auch mit G ++ geschieht.Warum verursacht Integer-Überlauf Fehler bei C++ iostreams?

sagen, dass ich dieses Programm haben:

#include <iostream> 
using namespace std; 

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

    return 0; 
} 

Wenn ich Überlauf absichtlich durch den ersten cin einen Wert geben, der größer ist als die maximale Grenze eines int ist, werden alle weiteren Anrufe zu cin.operator>>() sofort aus irgendeinem Grund zurück und a ist auf einen bestimmten Wert eingestellt. Der Wert scheint nicht definiert zu sein.

Warum und wo wird dieses Verhalten dokumentiert? Gibt es eine Möglichkeit herauszufinden, ob ein solcher Überlauf stattgefunden hat?

Auch dieses ähnliche Programm scheint zu funktionieren, wie ich es vorhabe. Wenn ich den Wert überlaufe, gibt es a einen Wert, und weiter so, als ob der Überlauf nie passiert ist.

Antwort

7

iostreams ausgelegt ist, Fehler zu erkennen und einen Fehlerzustand. Sie erhalten das gleiche Ergebnis vom Integer-Überlauf als von der Eingabe einer nicht-numerischen Zeichenkette.

Geben Sie cin (oder einen beliebigen Datenstrom) an bool oder überprüfen Sie cin.rdstate(), um festzustellen, ob ein Fehler aufgetreten ist.

Rufen Sie cin.clear() und cin.ignore() auf, um den Fehler zu löschen. Es wird an der Stelle der Charaktere auffliegen, die fehlgeschlagen sind.

Was die offizielle Dokumentation betrifft, so wird der Standard in den Tiefen von Iostreams leider etwas unergründlich. Siehe §27.6.1.2.1, 27.6.1.2.2 und 22.2.2.1.1/11 (kein Scherz):

- Die Reihenfolge der Zeichen in der Stufe 2 angesammelt hat verursacht Scanf würde einen Eingang melden Fehler. ios_base :: failbit ist err zugewiesen.

Die documentation for scanf ist genauso undurchdringlich, und ich werde es glauben, dass Überlauf ein Fehler sein soll.

1

Ich würde denken, dass cin sich aufgrund des ungültigen Lesevorgangs auf einen Fehlerstatus einstellt.

erste Antwort hier erklärt es.

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

einfach diesen Code versucht, und es scheint Einstellung zu Staat scheitern

#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 beginnt mit einem undefinierten Wert. Es ist nicht cin ist schuld. Versuchen:

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

Es wird überprüft, ob die Lese in a vor a

mit gelungen