Menüauswahl funktioniert nur zum Teil
-
Hallo liebe Gemeinde.
Um eure Tipps bzgl. Strings und Arrays umzusetzen, habe ich folgenden Code aufgesetzt:
#include <iostream> #include <string> using namespace std; int main() { int number_1; double Werte[100]; std::string Text; do { cout << "\tEingabe von Werten oder Text!" << endl; cout << endl; cout << "Was wollen Sie eingeben?" << endl; cout << "(1) Mehrere Werte" << endl; cout << "(2) Text "<< endl; cout << "(0) Abbruch" << endl; cin >> number_1; switch(number_1) { case 1: int number_2; int i; int j; do { cout << "Wie viele Werte wollen Sie eingeben?" << endl; cout << "(1) 10 Werte" << endl; cout << "(2) 50 Werte" << endl; cout << "(3) 100 Werte" << endl; cout << "(0) Abbruch!" << endl; switch(number_2) { case1: ... } }while(number_2!=0); break; case 2: cout << "Geben Sie einen Text ein!" << endl; cout << endl; getline(cin,Text); cout << endl; cout << "Das haben Sie eingegeben:" << endl; cout << endl; cout << Text; break; case 0: cout << "Abbruch!" << endl; break; } }while(number_1!=0); return 0; }Bis auf eines funktioniert das Programm so, wie ich mir das vorgestellt habe. Wenn ich jedoch Menüpunkt 2 eintippe, dann wird zwar
Bitte geben Sie einen Text ein! Das haben Sie eingegeben:ausgegeben, aber es erfolgt dann gleich wieder die Menüauswahl, also wird die Texteingabe übersprungen. Warum? Was habe ich falsch gemacht? Ich sehe den Fehler nicht...
Danke für die Antworten im Voraus.
Gruß
Max
-
cout << "Geben Sie einen Text ein!" << endl; // Ab Zeile 44 cout << endl; getline(cin,Text); cout << endl; cout << "Das haben Sie eingegeben:" << endl; cout << endl; cout << Text;Du flushst
coutfünf mal, und dann nach der Ausgabe vonTextgar nicht?Übrigens ist flushen hintereinander Blödsinn.
Und im Allgemeinen so viel zu flushen wie du ist auch Blödsinn.
Weil das bestimmte Streams verdammt verlangsamen kann.Mach es lieber so:
cout << "Geben Sie einen Text ein!" << endl; getline(cin,Text); cout << "Das haben Sie eingegeben:\n" << Text << endl;
-
Aber trotzdem wird die Eingabe übersprungen, obwohl ich die vielen "endl" rausgenommen habe.
-
silent_max schrieb:
Um eure Tipps bzgl. Strings und Arrays umzusetzen, habe ich folgenden Code aufgesetzt:
Unsere Tipps zu Arrays waren eigentlich, sie nicht zu benutzen, aber lassen wir mal gut sein.
ausgegeben, aber es erfolgt dann gleich wieder die Menüauswahl, also wird die Texteingabe übersprungen. Warum? Was habe ich falsch gemacht? Ich sehe den Fehler nicht...
istream::operator>> liest bis er einen Whitespace (zum Beispiel einen Zielenumbruch '\n') findet, aber ohne den Whitespace selber zu lesen. getline liest bis zu einem Zeilenumbruch, inklusive des Zeilenumbruchs.
Wenn du nun "2\nText\n" eingibst, dann kommt erst dein
cin >> number_1;, das liest die "2" aus der Eingabe, somit ist noch "\nText\n" im Eingabestrom. Dann kommt das getline und liest bis zum ersten '\n'. Also gar nichts. Danach ist noch "Text\n" im Eingabestrom.Das Problem kommt aus dem vermischen von zeilenbasierter und frei formatierten Eingabemethoden. Wenn du das machst, musst du genau sicher stellen, wie dein Format aussieht und entsprechend deine Leseoperationen anpassen. Ein paar gut gesetzte ignore und/oder wiederholte Eingaben mit Konsistenzprüfung des Inhalts bieten sich an.
-
Setz' ein
std::cin.ignore(1);vor Zeile 46.
-
Also müsste ich einfach dieses "getline(cin,Text)" mit "istream::operator>>" ersetzen???
-
silent_max schrieb:
Also müsste ich einfach dieses "getline(cin,Text)" mit "istream::operator>>" ersetzen???
Nein, du musst vor dem Lesen in Z. 46 den Puffer leeren, damit auch ein Text eingelesen wird.
Edit: Ah, ich ziehe es zurück: das geht auch, liefert aber (wie noch im selben Post erklärt) nicht immer den gewünschten Effekt.
-
silent_max schrieb:
Also müsste ich einfach dieses "getline(cin,Text)" mit "istream::operator>>" ersetzen???
Ja, das wäre eine gute Möglichkeit, sein dir aber über den Unterschied klar: getline liest eine ganze Zeile, operator>> bis zum ersten Whitespace (wobei führender whitespace übersprungen wird). operator>> liest bei Strings also nur genau ein einziges Wort ein. Falls mehrere Wörter in einer Zeile stehen, ist das ein Unterschied.
edit: Und genieß die Beiträge von Sone mit Vorsicht, der will sich vor allem profilieren. Ist zwar nicht direkt falsch, aber ich vermute mal, es hilft dir nicht wirklich viel.
-
Sorry, während ich mein Posting gesetzt habe, hast Du wohl auch Deines gesetzt. Und an der Stelle ein großes Danke an Dich, es funktioniert!.
-
SeppJ schrieb:
edit: Und genieß die Beiträge von Sone mit Vorsicht, der will sich vor allem profilieren. Ist zwar nicht direkt falsch, aber ich vermute mal, es hilft dir nicht wirklich viel.
Muss das "sich" nicht weg?
Und nein, das will ich nicht. Ich schreibe, was mir zum Code auffällt. Oder hättest du das mit den ganzen endls einfach kommentarlos durchgehen lassen?@max: Ach, sry. Hab' ich nicht gemerkt.
-
Sorry, SeppJ, dass es so zynisch klingt, aber wir können ja gleich mal ein Voting starten, wem man trauen kann und wem nicht....
-
silent_max schrieb:
Sorry, SeppJ, dass es so zynisch klingt, aber wir können ja gleich mal ein Voting starten, wem man trauen kann und wem nicht....
Na gut, dann helf ich dir von nun an eben nicht mehr.
-
ähm sowas geht doch eigentlich schief:
switch( switcher ) { case 1: func(); func(); }man sollte es doch wenn man mehr als eine Zeile brauch so schreiben:
switch( switcher ) { case 1: { func(); func(); } }
-
@SeppJ ...
So war es jetzt nicht gemeint... Es war jetzt kein persönlicher Angriff auf speziell auf Dich gerichtet, sondern eher eine Aussage in den Raum.
Was sagen denn die anderen Beteiligten...
@sone ...
Kann ich Dich weiterhin mit mancherlei Fragen "belästigen"??
-
silent_max schrieb:
@sone ...
Kann ich Dich weiterhin mit mancherlei Fragen "belästigen"??
Ich fürchte, du musst die Antwort von mir im anderen Thread einmal durchlesen. Es bringt alles nichts, wenn du versuchst ohne gutes Grundlagenbuch in der C++-Welt Fuß zu fassen.

Hol dir eins, arbeite es langsam durch und stell hier gern deine Fragen, dafür ist das Forum ja da. Es ist aber nicht da, um dir C++ beizubringen.aber wir können ja gleich mal ein Voting starten, wem man trauen kann und wem nicht....
Da wird ein Ergebnis herauskommen, das du wahrscheinlich nicht erwartest.
-
silent_max schrieb:
Wenn ich jedoch Menüpunkt 2 eintippe, dann wird zwar
Wenn Du eine Menüauswahl brauchst, ist das hier vielleicht interessant für Dich?
http://www.c-plusplus.net/forum/303169
-
Belli schrieb:
silent_max schrieb:
Wenn ich jedoch Menüpunkt 2 eintippe, dann wird zwar
Wenn Du eine Menüauswahl brauchst, ist das hier vielleicht interessant für Dich?
http://www.c-plusplus.net/forum/303169Jetzt hast du mich motiviert eine eigene Version zu schreiben.

-
meepmeep schrieb:
ähm sowas geht doch eigentlich schief:
switch( switcher ) { case 1: func(); func(); }man sollte es doch wenn man mehr als eine Zeile brauch so schreiben:
switch( switcher ) { case 1: { func(); func(); } }Nö, warum? Die klammern brauchste lediglich, wenn du objecte/Zeiger im case/default Fall erstellen willst. Zum abschließen eines falls is das Schlüsselwort break da.
-
silent_max schrieb:
So war es jetzt nicht gemeint... Es war jetzt kein persönlicher Angriff auf speziell auf Dich gerichtet, sondern eher eine Aussage in den Raum.
Was sagen denn die anderen Beteiligten...
Sone zitiert immer gerne aus dem C++-Standard und schreib immer sehr viel, was sich für Anfänger ziemlich kompetent anhört. Wenn er Lösungen anbietet, sind diese für Anfänger häufig zu kompliziert und nicht immer nachvollziehbar.
Die fachliche Kompetenz kann und möchte ich nicht beurteilen. Aber wenn SeppJ anderer Meinung ist, dann würde ich persönlich eher SeppJ vertrauen.
-
SeppJ habe ich ja inzwischen verkrault, also wird er meine Entschuldigung wohl nicht mehr annehmen. Schade...