Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C++] "cin" wird übersprungen (https://www.delphipraxis.net/103034-%5Bc-%5D-cin-wird-uebersprungen.html)

turboPASCAL 10. Nov 2007 10:37

Re: [C++] "cin" wird übersprungen
 
Tja, habe leider kein C / C++ konne also nur raten...

Matze 10. Nov 2007 10:54

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. :)

Chemiker 10. Nov 2007 11:44

Re: [C++] "cin" wird übersprungen
 
Hallo Matze,

Vielleicht Hilft Dir das weiter:

Code:
 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)));
Bis bald Chemiker

Matze 10. Nov 2007 11:49

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.

Chemiker 10. Nov 2007 12:33

Re: [C++] "cin" wird übersprungen
 
Hallo Matze,

Zitat:

Dann mach ich mich mal dran, zu verstehen, was da nun genau passiert.
viel Spaß dabei.

Bis bald Chemiker

Matze 10. Nov 2007 14:35

Re: [C++] "cin" wird übersprungen
 
Hi,

danke. Ganz steige ich noch nicht durch, cin ist komplexer als ich dachte.

Code:
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)));
Was die diese Zeile

Code:
while (! (cin >> eingabe))
genau macht, konnte ich nicht herausfinden. Ich weiß auch nicht, wie der <<-Operator heißt, daher kann ich auch nicht gezielt suchen.

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

Chemiker 10. Nov 2007 16:16

Re: [C++] "cin" wird übersprungen
 
Hallo Matze,

Code:
(cin >> eingabe)
Das kann wie eine normale Boole´schen Ausdruck testen, dies ist in der Klassendefinition so festgelegt.
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:
(!(cin >> eingabe))
TRUE ist, wenn ein Fehler in cin – Stream auftritt und FALSE bei Fehlerlosigkeit.

Ich hoffe das ist so ungefähr richtig ist.

Bis bald Chemiker

Matze 10. Nov 2007 17:01

Re: [C++] "cin" wird übersprungen
 
Hallo Chemiker,

danke, das mit dem Zeiger wusste ich noch nicht. Dann weiß ich das nun auch. :)

Grüße

OregonGhost 11. Nov 2007 11:11

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 C++ FAQ Lite eine Anlaufstelle sein. Dort findet sich auch ein schönes Beispiel für ignore:
Code:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Edit: Oh, und allgemein für dein Problem FAQ 15.2.
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:
if (cin >> eingabe)
ist also dasselbe wie
Code:
cin >> eingabe;
if (cin)
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().
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.

Matze 11. Nov 2007 11:55

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.
Seite 2 von 2     12   

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