cin.getline() und cin.ignore() funktionieren nur bei doppeltem Aufruf!



  • Hi,
    um einen längeren Text mit Leerzeichen einzulesen benutze ich cin.getline(satz,500), doch es kam nie zu einer Eingabeaufforderung. Ich habe den gleichen Befehl einfach nochmal aufgerufen und dann kommt die Eingabe.

    cin.getline(satz, 500);
    cin.getline(satz, 500);
    

    Das selbe passiert bei cin.ignore(), welches ich benutze um die Konsole aufzubehalten...funktioniert nur mit

    cin.ignore();
    cin.ignore();
    

    Beim cin.getline ist dieser Fehler jetzt zum ersten Mal aufgetreten, aber ich bekomm ihn nicht anders weg. Beim cin.ignore beim PRogrammende musste ich bisher immer doppelt aufrufen... Das muss doch acuh ohne gehen, oder?

    MfG Baweg



  • #include <string>
    
    std::string satz;
    std::getline(std::cin, satz);
    


  • Naja ich brauch das für die Berufsschule und leider will der Lehrer nicht dass wir string benutzen...müssen noch alles mit char-Arrays oder char-Pointern machen...



  • Hast du eventuell VOR dem getline() andere Daten eingelesen (über operator>>)? In dem Fall dürfte noch der Rest der vorigen Eingabezeile im Puffer sein (op>> lässt die Whitespaces nach der Eingabe stehen, inklusive \n) und vom ersten getline() abgefangen werden. Um das Problem zu lösen, mußt du erst das Ende der Zeile entsorgen und anschließend die nächste Zeile holen:

    cin.ignore(numeric_limits<std::streamsize>::max());
    cin.getline(satz,500);
    


  • Also meine Funktion sieht so aus:

    char * texteinlesen()
    {
    	char *eingabe = new char[100];
    	cout<<endl<<endl<<"Direkteingabe des Textes"<<endl<<endl<<endl;
    	cin.getline(eingabe,100);
    	cin.getline(eingabe,100);
    	return eingabe;
    }
    

    Mit nur einem cin.getline wird die Funktion einfach durchlaufen und man kann keine Eingabe machen!



  • wlkikiv 😉

    Lies dir mal meinen letzten Beitrag noch einmal durch, wenn du ihn nicht verstanden hast. Diese Funktion steht schließlich nicht alleine im Raum, sondern nur im Zusammenhang mit anderen Eingabebefehlen (irgendwo im Hauptprogramm).



  • Um ehrlich zu sein verstehe ich das echt nicht ganz...
    Im Hauptprogramm wird die Funktion in einem switch-case aufgerufen. Davor ist ein Menü wo man mit 1,2,3, usw. den Menüpunkt wählt und dementprechend wird dann geswitched...

    Was muss ich denn jetzt ändern?



  • Erstmal solltest du lernen zu LESEN, danach über das gelesene NACHDENKEN.

    Dein "cin>>wahl;" VOR dem switch() liest eine Zahl aus der Eingabe und lässt eventuell vorkommende Whitespaces dahinter stehen (inklusive dem obligatorischen \n, mit dem du die Eingabe abgeschlossen hast), das getline() in deiner Funktion liest bis zum nächsten \n, das es findet, bleibt also an den Resten der ersten Eingabe hängen. Also mußt du diese Reste entsorgen:

    //Möglichkeit 1:
    cin.ignore();//ignoriert ein Zeichen, also vermutlich dein \n
    cin.getline(...);
    
    //Möglichkeit 2:
    if(cin.peek()=='\n') gin.get();
    cin.getline(...);
    

    (Möglichkeit 2 hat den Vorteil, daß sie auch funktioniert, wenn die letzte Eingabe kein \n zurückgelassen hat)



  • Jo danke funzt beides...


Log in to reply