interessanter Fehler ! Overflow?
-
Wenn man bei folgendem Programm :
#include<iostream> using namespace std; int main() { int zahl1; int zahl2; cout<<"Bitte eine Zahl eingeben\t"; cin>>zahl1; cout<<"Bitte noch eine Zahl eingeben\t"; cin>>zahl2; cout<<"Zu erst eingegebene Zahl:"<<zahl1<<"\n"; cout<<"Als zweites eingegebene Zahl:"<<zahl2<<"\n"; }...bei der ersten Eingabe-Aufforderung mehr als 10 Ziffern eingibt wird die zweite Aufforderung übersprungen und gleich "Zu erst eingegebene Zahl: "xxx" " ausgegeben. "Als zweites eingegebene Zahl:" kommt auch raus, jedoch immer mit einer negativen Ziffernfolge, je nachdem welche Ziffernfolge mit über 10 Ziffern eingegeben worden ist verändert sich auch diese!
Kompilliert ganz normal in der Bash mitg++ xxx.cpp,danach
./xxxInteressant! Bin ich da etwa auf einen noch nicht behobenen Fehler in C++ oder so gestoßen und hab n Buffer-Overflow erzeugt ??!?!?

Was ist das? Fehler? Normale Funktionsweise von C++? ...?
-
Dann solltest du zur Sicherheit zwischen den beiden Eingaben den Eingabepuffer leeren. Dazu gibts hier einige Thread, einfach mal suchen.

P.S.: Schöner ist der Effekt, wenn du in einer Schleife viele int-Werte einlesen willst und dann einen Buchstaben eingibst.

-
mehr als 10 Ziffern eingibt wird
Also deine Zahl ist groesser als 10 Milliarden? Und wie gross kann eine Zahl maximal sein um sie im Binaersystem mit 32 Bit darzustellen (vorzeichenbehaftet)? Das ausgerechnet DU einen Bug in g++ findest, dem sonst noch niemand aufgefallen ist, wage ich zu bezweifeln. Das, was du da siehst, ist "undefiniertes Verhalten". Verwende die Funktion richtig und du hast keine Probleme.
-
@severin89-030
Guter Titel! Da wird wohl jeder neugierig.
Zum Problem:
Wenn du eine fehlerhafte Eingabe vornimmst, wie z.B. ein zu große Zahl, die nicht in einen Integer passt, geht der Eingabestream (cin) in einen Fehlerzustand, den du auch abfragen kannst. Z.B. so:cin >> zahl1; if (!cin) cout << "Fehlerhafte eingabe!" <<'\n';Desweiteren gibt es wie von _matze und knivil bereits erwähnt noch die Möglichkeiten den Eingabstream zu manipulieren (zu leeren, Fehlerzustände aufzuheben, usw.)
Die seltsamen Ausgaben liegen daran, dass du deine beiden Variablen zahl1 und zahl2 nicht z.B. mit 0 initialisiert hast. Hättest du es getan, dann wäre auch schnell klar geworden, dass bei Eingabe von zu großen Zahlen überhaupt keine Änderung an den Variablen vorgenommen wird.
@knivil
Ob das zu "undefiniertem Verhalten" zu zählen ist kann man bewzweifeln. Ich behaupte nein. Alle Konstruktionen sind richtig angewendet und verhalten sich Standardkonform.
-
knivil schrieb:
[...]Das, was du da siehst, ist "undefiniertes Verhalten". Verwende die Funktion richtig und du hast keine Probleme.
Was soll an dem Verhalten undefiniert sein? Das Verhalten bei fehlerhafter Eingabe in einen istream ist wohldefiniert.
-
Schade! Dachte schon ich hab ne tolle Entdeckung gemacht!
@ Kritiker:
dann ist also die maximale Eingabestelle bei "int" wohl die 10.?
@ knivil tztz..immer diese unfreundlichen Leute in den Foren!
Wenn ihr auch nur in Wirklichkeit so wärt! Internet heißt doch nich, dass man seinen Charakter gleich umkeheren muss, geschweige denn einfach raus zu motzen was so passt!an alle anderen: Thx für die Hilfe!
-
severin89-030 schrieb:
dann ist also die maximale Eingabestelle bei "int" wohl die 10.?
Es geht nicht um die Stelle, sondern die Anzahl bit, die ein int hat. (und das war auch das, was knivil gemeint hat..)
http://www.google.ch/search?q=2^32&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla
official&client=firefox-a
-
severin89-030 schrieb:
Schade! Dachte schon ich hab ne tolle Entdeckung gemacht!
Lass dich durch diesen kleinen Rückschlag in deinem Forscherdrang nicht entmutigen.

severin89-030 schrieb:
dann ist also die maximale Eingabestelle bei "int" wohl die 10.?
Auch eine 10-stellige Eingabe kann für int schon zu viel sein. In welchem Bereich sich die Zahl bewegen darf kannst du z.B. mit Hilfe der Headerdatei limits herausfinden.
#include<iostream> #include<limits> using namespace std; int main() { cout << "unsigned int min: " << numeric_limits<unsigned int>::min() << endl; cout << "unsigned int max: " << numeric_limits<unsigned int>::max() << endl; cout << "int min: " << numeric_limits<int>::min() << endl; cout << "int max: " << numeric_limits<int>::max() << endl; return 0; }232 ist eben (bei einem 32-Bit-Datenwort) nur für unsigned int das Maximum. Für int kommen noch die negativen Zahlen hinzu was dazu führt, dass das Maximum ca. halbiert wird.
Gibst du bei
cin >> zahl1etwas größeres als
numeric_limits<int>::max()ein ist das ein Fehler und zahl1 wird nicht verändert.