Problem: String mit Leerzeichen einlesen



  • Hallo,

    ich hab mich gerade bei euch registriert und freu erstmal dabei zu sein. Dann kommen wir auch gleich mal zu meinem ersten Problem. Und zwar möchte ich ganz einfach einen String mit Leerzeichen einlesen und dann wieder ausgeben.

    Siehe hier:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {	string test;
    	cout<<"Name: ";
    	getline(cin, test);
    	cout<<endl<<endl<<"Eingegeben: "<<test<<endl<<endl;
    	system("pause");
    	return 0;
    }
    

    Das klappt auch. Aber wenn ich dieses kleine Programm ein wenig modifiziere, dann will es nicht mehr so recht. Ich kann dann nicht mehr den Namen eingeben und er wird dementsprechend auch nicht ausgegeben. Das Programm scheint sofort zu "system("pause")" zu springen. Ich habe gar nicht die Möglichkeit was einzugeben. Allerdings weiß ich nicht warum. Vielleicht fällt euch ja was ein.

    Siehe hier:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {	string test;
    	char auswahl;
    
    	cout<<"e: neuen Namen anlegen"<<endl;
          cout<<"x: Beenden"<<endl<<endl;
          cout<<"Auswahl: ";
    	cin>>auswahl;
    	switch (auswahl){
    		case 'e':
    			cout<<"Name: ";
    			getline(cin, test);
    			cout<<endl<<endl<<"Eingegeben: "<<test<<endl<<endl;
    			system("pause");
    			break;
    		case 'x':
    			break;
                default:
                      break;
          }
    	return 1;
    }
    

    Wie gesagt ich weiß wirklich nicht warum es nicht funktioniert. Eigentlich sollte er auch in der modifizierten Version den eingegebenen Namen mit Leerzeichen lesen, aber wie gesagt komm ich gar nicht dazu den Namen einzugeben. Vielleicht könnt ihr mir ja helfen. Wär euch echt sehr dankbar.



  • Schreibe nach deinem

    cin >> auswahl;
    

    ein

    cin.get();
    

    Das tust du deswegen, da cin nur Zeichen einliest die keine Blancs sind (sprich keine Leerzeichen, Tabs, Neue-Zeile, etc) und bei Eingabe von x oder e (und anschließendem Enter-Druck) intern cin x\n oder e\n zu sehen bekommt. Nun liest cin aber nur x oder e ein und lässt das \n im Puffer stehen. Und springt dann in den entsprechenden case-Block. Dort wartet nun die getline()-Funktion welche bis zum ersten \n liest. Da aber noch ein \n im Puffer steht wird das Einlesen quasi erst garnicht angefangen und es wird direkt nach der getline()-Funktion fortgesetzt.

    P.S.: system("Pause"); ist übrigens keine gute Wahl.

    Caipi



  • cin.get() halte ich in diesem Fall für dirty, warum nicht:

    cin.ignore(cin.rdbuf()->in_avail());
    

    MfG SideWinder



  • Danke für die rasche Antwort. Ja das klingt logisch. Da hätte ich auch selber drauf kommen können. Was wär denn eine bessere Möglichkeit für "system("pause")"?



  • @Grammi:
    Siehe Win32 und Konsolen-FAQ den Thread "Automatisches Schließen verhindern" o.ä.

    @Sidewinder:
    Jo. Hast recht. In diesem Fall ist es wahrscheinlich besser mit deiner Variante (Falls mehr als ein Zeichen eingegeben wurde). Ansonsten meine ich mich aber erinnern zu können, dass man cin.ignore(cin.rdbuf()->in_avail()) wenn möglich verhindern sollte, da es den gesammten Puffer leert. Mal sehen ob ich den Thread noch finde...

    Caipi


Log in to reply