Probleme beim mehrmals durchlaufen eines Codeabschnittes
-
Hallo zusammen,
folgendes Problem ich habe eine do-while Schleife programmiert in der ich mehrere "cin >>" Befehle ausführe, beim ersten durchlauf läuft das Programm ganz normal. Lasse ich die Schleife aber erneut laufen (also ohne das Programm zwischen durch zu schließen) behalten die "cin >>" Befehle Ihre aus dem ersten Durchgang eingetragenen Werte und lassen sich auch keine neuen Werte zuweisen.
Was mache ich falsch??
gruß Silver
-
Es wäre nicht schlecht wenn du ein wenig Code posten würdest.
-
Jop, da gibt's zwei Möglichekeiten:
Entweder es befindet sich zufällig noch was im Eingabepuffer oder du löscht den vorherigen Wert nicht
Poste mal einbisschen Code.
-
Ich tippe darauf, daß irgendeine deiner Eingaben cin in Fehlerstatus gesetzt hat (z.B. durch ungültige Eingaben). Das mußt du per cin.fail() abfragen und mit cin.clear() zurücksetzen, bevor du wieder etwas eingeben kannst.
-
Hmm ok ich schicke euch mal den Code:
do { int selection = 0; system("cls"); cout << "Menue:\n\n"; cout << "Was moechten Sie jetzt tun?\n"; cout <<" (1) Neuer Lehrer\n"; cout <<" (2) Loesche Lehrer\n"; cout <<" (3) Schueleruebersicht\n"; cout <<" (4) Loesche Schueler\n"; cin >> selection; if(selection == 1) { cout << "Bitte geben Sie ein: \n"; cout << "Name: "; cin >> dbManager.m_ov.teacher.name; cout << "\nVorname: "; cin >> dbManager.m_ov.teacher.forename; cout << "\nPasswort: "; cin >> dbManager.m_ov.teacher.password; cout << "\nAdminrechte: "; cin >> dbManager.m_ov.teacher.isAdmin; cout << "\nDer Loginname wir automatisch erstellt: "; dbManager.m_ov.teacher.loginName = dbManager.m_ov.teacher.forename + dbManager.m_ov.teacher.name; cout << dbManager.m_ov.teacher.loginName << endl; dbManager.CreateNewTeacher(); if(!dbManager.m_ov.error.error) { cout << "\nLehrer wurde erstellt\n"; } else { cout << dbManager.m_ov.error.errorMessage << endl; } } else if (selection == 2) { cout << "Bitte Loginname des Lehrers angeben: "; cin >> dbManager.m_ov.teacher.loginName; cout << "\nBitte das Passwort des Lehrers angeben: "; cin >> dbManager.m_ov.teacher.password; if(dbManager.m_ov.login.loginName == dbManager.m_ov.teacher.loginName && dbManager.m_ov.login.islogin) { cout << "Ein aktiver Account kann nicht geloescht werden"; } else { dbManager.DeleteTeacher(); if(!dbManager.m_ov.error.error) { cout << "Lehrer wurde geloescht\n"; } else { cout << dbManager.m_ov.error.errorMessage; } } } else if (selection == 3) { cout << "Noch keine Funktionalität möglich\n"; } else if (selection == 4) { cout << "Noch keine Funktionalität möglich\n"; } else { cout << "Sie haben eine Wert angegeben der nicht im Menue steht!!!"; } cout << "\nMoechten Sie etwas weiteres durchfuehren? true oder false\n"; cin >> turnRound; }while(turnRound);
-
Was genau gibst du denn bei der letzten Frage ein? bool-Werte werden als Ganzzahlen eingelesen, d.h. du mußt die Frage mit 0 (nein) oder 1 (ja) beantworten, sonst meldet cin einen Eingabefehler und verweigert die Zusammenarbeit.
aber einfacher dürfte es sein, die "nochmal?" Abfrage mit J/N beantworten zu lassen:
char wdh; do { ... cout<<"Nochmal? (j/n)"; cin>>wdh; } while(toupper(wdh)!='N');
-
Achso ich dachte ich könnte da ein true oder false zurück geben(reinschreiben).
Hab das direkt mal ausprobiert und es funktioniert, danke für die schnelle Hilfe.
-
"true" und "false" gehen soweit ich weiss auch, bloss muss man dafür irgend so ein doofes bit im dem stream umschalten. ich werd' mir wohl nie merken wie die alle heissen...
-
Ich würde es mal damit versuchen, indem ich fflush(stdin) vor jede cin Eingabe setze. Weiß aber nicht, obs hinhaut. Müsste eigentlich klappen.
-
* Die C Funktion fflush() ist in der Headerdatei <cstdio> deklariert.
-
borgolte schrieb:
Ich würde es mal damit versuchen, indem ich fflush(stdin) vor jede cin Eingabe setze. Weiß aber nicht, obs hinhaut. Müsste eigentlich klappen.
gaaaanz schlechte Idee!
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html
Ersatz für fflush(stdin):
void ignore() { int c; while ( (c=getchar()) != '\n' && c != EOF ); }