Frage zu getline()



  • Warum wird bei diesem Programm, nach Eingabe der auswahl "1", getline() übersprungen???

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	int auswahl;
    	string uebersetzen;
    
    	cout << " Menue:" << endl;
    	cout << "   Auswahl1     <1>" << endl;
    	cout << "   Auswahl2     <2>" << endl;
    	cout << "   Auswahl3     <3>" << endl;
    	cout << endl;
    	cout << "Ihre Eingabe: ";
    	cin >> auswahl;
    
    	if(auswahl == 1)
    	{
    		cout << "Gegen Sie einen Satz ein: ";
    		getline(cin, uebersetzen);   // das wird übersprungen!!!
    		cout << uebersetzen << endl << endl;
    	}
    
    	return 0;
    }
    

    komisch ist, wenn ich jetzt die komplette "auswahl" weglasse, oder das getline am Anfang hinsetzte funktioniert es! Hoffe auf eine Hilfe

    mfg Shark



  • du musst die Daten löschen, die sich noch im eingabe Strom befinden:

    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    int main() 
    { 
        int auswahl; 
        string uebersetzen; 
    
        cout << " Menue:" << endl; 
        cout << "   Auswahl1     <1>" << endl; 
        cout << "   Auswahl2     <2>" << endl; 
        cout << "   Auswahl3     <3>" << endl; 
        cout << endl; 
        cout << "Ihre Eingabe: "; 
        cin.sync() // löscht den Buffer
        cin.clear(); // löscht gesetzte flags
        cin >> auswahl; 
    
        if(auswahl == 1) 
        { 
            cout << "Gegen Sie einen Satz ein: "; 
            cin.sync() // löscht den Buffer
            cin.clear(); // löscht gesetzte flags
            getline(cin, uebersetzen);   // das wird übersprungen!!! 
            cout << uebersetzen << endl << endl; 
        } 
    
        return 0; 
    }
    

    cu max



  • 1000 dank für die schnelle Hilfe, funktioniert super ... bis auf das, dass du hinter "cin.sync()" das Semikolon vergessen hast 😉

    mfg Shark



  • cin.sync() löscht allerdings keinen Puffer.

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

    ignoriert die nächsten x Zeichen wobei x gleich der Anzahl der Zeichen im Puffer (in_avail) sind. Damit scheint der Puffer leer zu sein.

    MfG SideWinder



  • danke! doch es funktioniert so wie Master_Max es gesagt hat, heißt das ich kann das "cin.sync()" weg lassen????

    mfg Shark



  • Es gibt ein Funktion, die getline() heißt 😕 😕 *confused*
    In meinem Kernighan/Ritchie gibt es auch eine Funktion "getline()", aber die wird immer "selber geschrieben".
    btw: Wie ist es eigentlich rechtlich, wenn ich Funktionen, die in Buchbeispielen vorkommen, in meinen Programmen auch verwenden würde? Dürfte ich das?

    flyingCoder.



  • Hmmm kommt vielleicht drauf an wofür das Buch ist und welche Copyrights draufliegen. Wenn es ein Lernbuch ist für C z. B., dann denke ich ist es ok, wenn du die Funktionen zum Üben verwendest. Ich glaube auch, dass es erst ein Problem geben könnte, wenn du Profit aus einem deiner Programme schlagen willst.



  • @shark95: Nein du musst cin.sync() durch eben meine Codezeile ersetzen.

    @flyingCoder: std::getline() ist eine C++-Funktion, in C gibt es sie nicht, deswegen kommt sie auch in deinem schlauen Buch nicht vor ;).

    MfG SideWinder



  • AJ schrieb:

    Hmmm kommt vielleicht drauf an wofür das Buch ist und welche Copyrights draufliegen. Wenn es ein Lernbuch ist für C z. B., dann denke ich ist es ok, wenn du die Funktionen zum Üben verwendest.

    Naja. Auf der ersten Seite stehen ziemlich heftige Worte, was Copyright betrifft. Wenn ich ein paar Variablennamen ändere, kann mir wohl keiner ...

    Ich glaube auch, dass es erst ein Problem geben könnte, wenn du Profit aus einem deiner Programme schlagen willst.

    Dann würde ja niemand den quelltext kennen. 😃 😃 😃

    flyingCoder.



  • flyingCoder schrieb:

    Dann würde ja niemand den quelltext kennen. 😃 😃 😃

    flyingCoder.

    Sie dir da mal nicht so sicher 😃


Anmelden zum Antworten