![]() |
Re: [C++] "cin" wird übersprungen
Tja, habe leider kein C / C++ konne also nur raten...
|
Re: [C++] "cin" wird übersprungen
Achso, dennoch vielen Dank. Wenigstens ist das alte Problem mit der Endlosschleife nun gelöst und das andere ist bestimmt auch irgendwie behebbar. :)
|
Re: [C++] "cin" wird übersprungen
Hallo Matze,
Vielleicht Hilft Dir das weiter:
Code:
Bis bald Chemiker
do
{ if (! ersterDurchlauf) { cout << "\n\t --> Fehleingabe!\n"; cout << "\n Geben Sie eine ganze Zahl zwischen 1 und 4 ein.\n"; } ersterDurchlauf = false; while (!(cin >> eingabe)) { cin.clear(); while (cin.get() != '\n'); cout << "\n\t --> Fehleingabe!\n"; cout << "\n Geben Sie eine ganze Zahl zwischen 1 und 4 ein.\n"; } } while (! ((eingabe == 1) || (eingabe == 2) || (eingabe == 3) || (eingabe == 4))); |
Re: [C++] "cin" wird übersprungen
Hallo Chemiker,
klasse, das funktioniert, herzlichen Dank. :thumb: Dann mach ich mich mal dran, zu verstehen, was da nun genau passiert. ;) Edit: Das ganze Zeugs mit ersterDurchlauf kann ich mir so auch ersparen, sehr schön. |
Re: [C++] "cin" wird übersprungen
Hallo Matze,
Zitat:
Bis bald Chemiker |
Re: [C++] "cin" wird übersprungen
Hi,
danke. Ganz steige ich noch nicht durch, cin ist komplexer als ich dachte.
Code:
Was die diese Zeile
do
{ while (! (cin >> eingabe)) { cin.clear(); // das löscht die Fehler-Flags (welche auch immer das sind) while (cin.get() != '\n'); // das liest die Zeichen im Puffer so lange ein (und entfernt sie daraus), // bis ein "\n" (Return) kommt cout << "\n\t --> Fehleingabe!\n"; } } while (! ((eingabe == 1) || (eingabe == 2) || (eingabe == 3) || (eingabe == 4)));
Code:
genau macht, konnte ich nicht herausfinden. Ich weiß auch nicht, wie der <<-Operator heißt, daher kann ich auch nicht gezielt suchen.
while (! (cin >> eingabe))
Das Problem bei dem Code ist jedoch noch, dass bei Eingabe von Buchstaben die Meldung "Fehleingabe" ausgegeben wird, wenn ich jedoch ganze Zahlen eingebe, sehe ich keine Meldung, muss aber weitere Zahlen eingeben, bis sie 1, 2, 3 oder 4 ist. Ich denke, für diesen Fall brauche ich dann doch die boolsche Variable ersterDurchlaf. Daher vermute ich, dass der boolsche Ausdruck der genannten Zeile wahr ist, wenn die Zuweisung des Eingabewerts zur Variablen eingabe erfolgreich war, es sich also um den selben Datentyp handelt. Ist das richtig? Grüße |
Re: [C++] "cin" wird übersprungen
Hallo Matze,
Code:
Das kann wie eine normale Boole´schen Ausdruck testen, dies ist in der Klassendefinition so festgelegt.
(cin >> eingabe)
Der Ausdruck (cin >> eingabe) wird in einen Zeiger umgewandelt, dessen Wert vom Fehlerstatus des Streams abhängt. Ist der Zeiger NULL (also FALSE) zeigt er an, dass ein Fehler im Stream aufgetreten ist. Während ein Nicht-Null-Zeiger (also TRUE) angibt, dass kein Fehler vorhanden ist. Man kann dann das ganze mit ! umkehren , so dass
Code:
TRUE ist, wenn ein Fehler in cin – Stream auftritt und FALSE bei Fehlerlosigkeit.
(!(cin >> eingabe))
Ich hoffe das ist so ungefähr richtig ist. Bis bald Chemiker |
Re: [C++] "cin" wird übersprungen
Hallo Chemiker,
danke, das mit dem Zeiger wusste ich noch nicht. Dann weiß ich das nun auch. :) Grüße |
Re: [C++] "cin" wird übersprungen
Um es etwas klarer zu machen:
1. >> heißt entweder operator>>, Shiftoperator oder Streamoperator. Damit solltest du suchen können (oder einfach auf cppreference.com oder cplusplus.com mal unter iostream gucken). Bei diversen Fragen, insbesondere esoterischen, sollte auch das ![]()
Code:
Edit: Oh, und allgemein für dein Problem
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
![]() 2. Alle standardmäßig definierten operator>>, die einen istream& als ersten Parameter nehmen, haben auch wieder istream& als Rückgabewert. In der Praxis bekommst du also die Referenz auf den Stream zurück, um den Aufruf verketten zu können.
Code:
ist also dasselbe wie
if (cin >> eingabe)
Code:
Der Ausdruck wird selbstverständlich nicht in einen Zeiger umgewandelt, sondern in bool konvertiert (operator bool(), falls du dich an den anderen Thread erinnerst :mrgreen:) und kann damit auf true oder false überprüft werden. Im weitesten Sinne ist false dabei die Entsprechung zu bad() und true die Entsprechung zu good().
cin >> eingabe;
if (cin) 3. Wenn man so will, hast du recht, der Ausdruck aus 2. wird true, wenn eingabe korrekt gefüllt werden konnte, und false, wenn nicht. |
Re: [C++] "cin" wird übersprungen
Hallo,
vielen Dank für deinen Beitrag. Dann müsste nun ja alles geklärt sein. :) Speziell die Links sind super und werde ich mir näher ansehen. Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz