endlos schleife entsteht und ich kann sie nicht lösen



  • Hallo!

    Das "Programm" das ich hier schreibe, dient nur zu meiner Übung. Ich lerne seit 3 Tagen C++ und bin absoluter Neuling. PHP kann ich recht gut.

    Zum Problem: Das Programm erwartet eine Eingabe über die Console (int eingabe). Wenn Zahlen - egal ob im gültigen Wertebereich oder nicht - eingegeben werden, läuft alles wie es soll. Gibt der Benutzer aber einen Buchstaben ein (erwartet wird eine Zahl) entsteht eine Endlosschleife und ich bin mir nicht sicher warum. Laut meinem Buch aus dem ich lerne, wird ein Buchstabe/Zeichen in einer int Variable einfach als der Wert gespeichert, durch den er im System dargestellt wird. Also mit einer Zahl...

    Ich habe verschiedenes ausprobiert, aber immer entsteht diese endlos Schleife wenn ich bei der Ja/Nein Frage die man mit 1 oder 2 beantworten sollte einen Buchstaben eingebe...

    Was mich wundert, normal müßte beim 2 aufruf der While-Schleife ja wieder auf CIN gewartet werden, aber die Schleife wird ausgeführt, ohne das darauf gewartet wird. Was kann ich hier tun?

    Ich entwickle mit Visual Studio 2005 pro auf XP mit SP2 und express auf Vista - jeweils alle Updates...

    Okay hier der Code:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	string vorname;
    	string vorname1;
    	string vorname2;
    	int eingabe;
    
    	vorname1 = "Hirs";
    	vorname2 = "hirs";
    
    	cout << "Hallo!!" << endl << "Wie lautet dein Vorname?" << endl << ">>";
    	cin >> vorname;
    	if ( vorname == vorname1 || vorname == vorname2 )
    	{
    		do
    		{
    			cout << "Bist du Hirs Nagler? (1=Ja, 2=Nein)" << endl << ">>";	
    			cin >> eingabe;
    			if ( eingabe == 1 || eingabe == 2 )
    			{
    				if ( eingabe == 1 )
    				{
    					cout << "Hallo Hirs!" << endl << "Das ist dein persoenliches nur feur dich geschriebenes Programm!" << endl << "Viel mehr als diese Ausgabe bekommst du hier leider nicht aber immerhin =)" << endl << endl << "Liebe Gruesse, Olli" << endl << endl;
    				}
    				if ( eingabe == 2 )
    				{
    					cout << "Tja, Pech!! Es kann nur einen geben!" << endl << endl;			
    				} 		
    			} 
    			else
    			{
    				cout << "Falsche Eingabe: Bitte versuche es erneut! " << endl << endl;		
    			}
    		}
    		while ( eingabe < 1 || eingabe > 2 );
    	}
    	else
    	{
    		cout << "Tut mir Leid, aber dieses Programm ist nicht fuer dich!!!" << endl << endl;		
    	}
    }
    

    Danke an alle, die sich mein Problem anschauen.



  • Du musst die Fehlerbits löschen und dann den restlichen Puffer aus der Eingabe leeren...

    Deine Eingaben sollten so aussehen...

    <a href= schrieb:

    (D)Evil">
    ...

    // ...
     while (!(std::cin >> value)) { std::cin.sync(); std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
    // ...
    

    ...

    Vereinfacht gesagt machst du damit solange eine Eingabe bis sie zum Typ der Variable passt...

    Gruß
    zeigerzeiger



  • while (!(std::cin >> value)) { std::cin.sync(); std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
    

    Ganz ehrlich, so nützlich diese Zeile auch sein mag, sie ist schrecklich.



  • Badestrand schrieb:

    ...
    Ganz ehrlich, so nützlich diese Zeile auch sein mag, sie ist schrecklich.

    😕
    Klär mich auf... Warum ist die Zeile so schrecklich...



  • zeigerzeiger schrieb:

    😕
    Klär mich auf... Warum ist die Zeile so schrecklich...

    hehe, ok 🙂 Ich muss mich aber korrigieren, sie ist nicht unbedingt schrecklich, ich persönlich finde sie aber schrecklich. Und zwar einfach, weil ich sie fürchterlich zu merken finde, dafür, dass sie eine so simple Funktion hat.
    Und so einfach verständlich ist sie (zumindest für Anfänger) überhaupt nicht, erst sync, dann clear, dann ignore, der erste Parameter davon ist ein Funktionsaufruf von max einer statischen Template-Klasse mit dem Template-Parameter stream_size.

    Also ehrlich, und das nur dafür, dass die Funktion auf eine gültige Eingabe wartet...



  • Ahh... OK... 🙂
    Und ich dachte schon da ist mal wieder irgendwas nicht so wie es sein sollte... 😃



  • Badestrand schrieb:

    while (!(std::cin >> value)) { std::cin.sync(); std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
    

    Ganz ehrlich, so nützlich diese Zeile auch sein mag, sie ist schrecklich.

    sie ist ja auch schrecklich, aber mit anderer formatierung geht's vielleicht...

    using namespace std;
    ...
    while (!(cin >> value)) 
    { 
       cin.sync(); 
       cin.clear(); 
       cin.ignore (numeric_limits<streamsize>::max(), '\n'); 
    }
    ...
    

    naja, immer noch ziemlich schlimm, wenn man bedenkt was der code machen soll 🙄



  • Eine (D)Evil formatierung halt.



  • bleachblondhair schrieb:

    Eine (D)Evil formatierung halt.

    ach der, ja, bei dem muss ich auch immer an Jesters signatur denken 😉



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @undertakter: Ahhja. Und welche Zeile der Signatur meinst du? Zufällig diese:
    [quote=Jester]Die dümmsten Programmierer schreiben die dicksten Programme.[/qoute]

    Tjo ist ja interessant woran ihr immer so alles denkt. Scheint euch ja nicht so zu liegen, das Denken.



  • super! danke schön!

    es hat schon seine logik, wenn man es weiß, aber aufwendig finde ich es allemal.

    danke für eure hilfe!!!

    🙂



  • (D)Evil schrieb:

    Ahhja. Und welche Zeile der Signatur meint ihr? Zufällig diese:

    Jester schrieb:

    Die dümmsten Programmierer schreiben die dicksten Programme.

    Tjo ist ja interessant woran ihr immer so alles denkt. Scheint euch ja nicht so zu liegen, das Denken.

    Ich weiß nicht, wen du mit "ihr" meinst, aber ich musste nicht dran denken. Undertaker wahrscheinlich schon.

    Mich würde mal interessieren, ob du in einem Team programmierst und andere auch deinen Code lesen oder ändern müssen. Wenn ja, haben die sich noch nie über deine Formatierung beschwert?



  • [quote="(D)Evil"]Ahhja. Und welche Zeile der Signatur meint ihr? Zufällig diese:

    Jester schrieb:

    Die dümmsten Programmierer schreiben die dicksten Programme.[/qoute]
    Tjo ist ja interessant woran ihr immer so alles denkt. Scheint euch ja nicht so zu liegen, das Denken.

    oh shit 😮
    ich dachte nicht, dass der thread ins C++ forum geschoben wird und du ihn jemals zu gesicht bekommst.
    *schäm*



  • Tjo das verbessert es nicht 😉 Tss aber da kann ich mit leben wenn ich von dir so einen Kommentar bekomme 😉

    @bleachblondhair:
    Ehm doch ich arbeite rel. oft im Team. Allerdings ist meine Formatierung dann oft ein wenig übersichtlicher. Das ich das in eine Zeile gepackt habe, liegt daran, dass der Rest dahinter sozusagen einfach überlesen werden soll und nur wichtig an der Aussage ist, dass der Wert eingelesen wird 😉


Anmelden zum Antworten