Forum: PC-Programmierung Zeichen mit int-Variable einlesen in C++


von Marc (Gast)


Lesenswert?

Hallo, kann mir einer sagen was eigentlich genau passiert wenn ich 
versuche mit einem "cin" einen Buchstaben auf eine int-Variable zu 
schreiben? Ich hätte erwartet dass nun z.b. der Wert des Zeichen da 
steht, aber scheinbar entsteht noch viel größerer Bockmist. Was genau 
wird hier also geschrieben? Danke für die Nachhilfe ;-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Marc schrieb:
> Hallo, kann mir einer sagen was eigentlich genau passiert wenn ich
> versuche mit einem "cin" einen Buchstaben auf eine int-Variable zu
> schreiben?

Da passiert nicht allzu viel. Der >>-Operator versucht bei einer int-
Variable, eine Zahl (defaultmäßig im Dezimalsystem) im Eingabedatenstrom
zu parsen. Es wird also nur eine Folge von Ziffern (optional mit einem
vorangehenden Vorzeichen) akzeptiert. Das erste Zeichen, das nicht als
Bestandteil der Zahl interpretiert werden kann, beendet den Lesen der
Zahl.

Kann keine einzige Ziffer gelesen werden, weil das nächste Zeichen in
der Eingabe bspw. ein Buchstabe ist, ist der Lesevorgang fehlgeschlagen,
und der int-Variable kann kein sinnvoller Wert zugewiesen werden. Dann
wird das Fehlerflag ios::failbit gesetzt. Die Fehlerflags können mit
cin.rdstate() abgefragt werden.

Ich weiß nicht genau, welchen Wert die int-Variable gemäß C++Standard im
Fehlerfall haben sollte. Möglicherweise ist er undefiniert. Die Lauf-
zeitbibliothek des GCC scheint die Variable immer auf 0 zu setzen. Mög-
licherweise lassen andere Laufzeitbibliotheken die Variable einfach
unverändert. Wenn sie noch schon vorher initialisiert wurde, enthält sie
dann einen zufälligen Wert.

> Ich hätte erwartet dass nun z.b. der Wert des Zeichen da steht

Du meinst den ASCII-Code, also bei einem 'A' der Wert 65? Warum sollte
das so sein? Dann müsste ja konsequenterweise beim Zeichen '2' nicht der
Wert 2, sonder der Wert 50 in die Variable geschrieben werden.

Wenn du wirklich den ASCII-Code des nächsten Zeichens in de Eingabe
lesen möchtest, musst du statt einer int- eine char-Variable übergeben
und diese ggf. anschließend in ein int casten.

von Marc (Gast)


Lesenswert?

Ja, ich "arbeite" momentan mit Codebocks (gcc) und mir wurde die Frage 
selbst  auch nur gestellt, denn wenn man z.B. eine Schleife aufbaut und 
dann den Buchstaben der in die int geschrieben wurde mit einer Switch 
Anweisung auswertet steht zwar eine Null in der Variable, aber die 
Schleife wird nun unendlich oft durchlaufen. Ich persönlich hätte die 
Abfrage entweder nur auf Char laufen lassen oder halt vorher Buchstaben 
ausgeschlossen mittels einer Abfrage (eventuell gibts auch auch besser 
Methoden um später auch Mehrstellige Zahlen für switch Anweisungen 
zuzulassen). Er hatte aber eine int Abfrage gestartet und dort kommt es 
halt zu diesem Phänomen, weshalb ich dachte das vielleicht irgendwelche 
Nachbarbereiche beschrieben werden. Und ich hätte jetzt nicht 
zwangsläufig korrekten Ascii Code erwartet, aber halt irgendwelche 
Zahlen die dann darin stehen.

von Marc (Gast)


Lesenswert?

Achso als Anmerkung, am Anfang der Schleife steht das cin, auch ein neu 
beschreiben der Variable mit Null oder auch die Funktion cin.sync();
 bringt da nichts neues.

von Marc (Gast)


Lesenswert?

Noch mal ich, wahrscheinlich würde es mir helfen wenn ich die Register 
einsehen könnte, ist das mit Codeblocks möglich bzw. gibt es ein 
Programm mit dem so was gut durchführbar ist?

von Marc (Gast)


Lesenswert?

Hm ich habs gefunden, du hattest natürlich recht, es sind noch 
Fehlerbits gesetzt und den Eingabespeicher muss man natürlich auch 
leeren. Sry für die blöde Fragerei und danke für die Hilfe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.