While + Switch
-
Hallo,
habe ein Problem mit dem folgenden Programm. Warum werden die Anweisungen die im Case Block stehen übersprungen, wenn ich die switch Anweisung mit einer While Schleife ablaufen lasse.#include <iostream> #include <cstring> using namespace std; int main() { int a = 1,b; char name_klasse[1000]; char name_schueler[20]; while(a) { cout << "Wählen Sie eine Option aus (1) Name eingeben (2) Namen der Klasse anzeigen (3) Abbruch\n\n"; cin >> b; switch(b) { case 1: { cout << "\nGeben sie den Namen eines Schuelers ein:\n"; gets(name_schueler); strcat(name_klasse,name_schueler); strcat(name_klasse,"\n"); } ; case 2: { cout << name_klasse; } ; case 3: { a = 0; cout << "\n"; } ; default: cout << "\nUngueltige Eingabe\n"; ; } } system("pause"); return 0; }/edit pumuckl: cpp-Tags, demnächst bitte selber machen!
-
wo wird da was übersprungen? Was ich sehe, sind fehlende breaks nach jedem case.
-
Da Fehlen die break's so das alle case-Fälle der Reihe nach abgearbeitet werden.
Auch case 3: mit dem a = 0;
Und somit ist die while-Schleife beendet.
-
Kauf dir ein vernünftiges Buch! char-Arrays und strcat sind Uralt-C-Relikte, die man in C++ nicht benutzen sollte (insbesondere als Anfänger).
-
In der Schnelle habe ich die breaks vergessen. Trozdem kann ich zum Beispiel bei case 1 nicht den Namen eingeben, da er gets() einfach überspringt. Am Besten kopiert ihr einfach mal den Code und probiert es selbst einmal aus.
-
anfaenger2012 schrieb:
In der Schnelle habe ich die breaks vergessen. Trozdem kann ich zum Beispiel bei case 1 nicht den Namen eingeben, da er gets() einfach überspringt. Am Besten kopiert ihr einfach mal den Code und probiert es selbst einmal aus.
Da wird gar nichts übersprungen, und du hast auch etwas eingegeben, nämlich
1Enter. Die 1 wurde verarbeitet das Enter steckt noch im Puffer. Dann kommt gets daher und schnappt sich den Lümmel. D.h. schreib vor gets:cin.ignore(32,'\n');
-
Gibt es noch eine andere Möglichkeit, denn nachdem ich diesen Code eingeben habe. Kann ich zwar den Namen eingeben. Aber komme nicht mehr weiter. Außerdem was bewirkt cin.ignore(32,'n') überhaupt.
-
cin.ignore(32, '\n')wirft Zeichen vom Eingabepuffer solange weg, bis entweder 32 Zeichen weggeworfen wurden - oder bis das Zeichen '\n' gefunden wurde (und wirft es ebenfalls noch weg).Wieso benutzt du C-Strings? Benutze besser C++ Strings!
Ich denke, das Problem sollte geloest sein, indem du name_klasse mit einem leeren String (Null-Zeichen) initialisierst:
char name_klasse[1000] = "";
-
Das Problem ist das ich den Namen nicht eingeben kann, weil gleich wieder die Optionen kommen.
-
anfaenger2012 schrieb:
Das Problem ist das ich den Namen nicht eingeben kann, weil gleich wieder die Optionen kommen.
Wurde im Topic schon indirekt beantwortet: fehlende breaks.
Hier mal ne Lösung, an der du dich orientieren kannst:
#include <iostream> #include <string> using namespace std; int main() { bool runFlag = true; int option; string className; string studentName; while (runFlag) { cout << "Wählen Sie eine Option aus: Name eingeben[1], Namen der Klasse anzeigen[2], Abbruch[3]: "; cin >> option; cin.ignore(); switch (option) { case 1: cout << "Geben sie den Namen des Schuelers ein: "; getline(cin, studentName); cout << "Geben sie den Namen der Klasse ein: "; getline(cin, className); break; case 2: cout << className << '\n'; break; case 3: runFlag = false; break; default: cout << "Ungueltige Eingabe\n"; break; } } }
-
Poste uns immer den aktuellen Code, wenn du auf weitere Probleme stößt. D.h. den Code, bei dem du die breaks nicht mehr vergisst und cin.ignore mit eingebaut hast. Nur so kann man verlässlich nachvollziehen, was bei dir nicht richtig läuft und dir Hinweise geben, wo dein Problem liegt.