Endlosschleifen bei getline



  • Hi 🙂

    habe folgenden Code verfasst:
    (nur Ausschnitt)

    void addMenu(trainer &a)
    {
    	bool go = true;
    
    	while(go)
    	{
    		int eing;
    		cout << "(1)Vokabeln hinzufuegen" << endl;
    		cout << "(2)Hauptmenu" << endl;
    		cin >> eing;
    		cout << endl;
    		switch (eing)
    		{
    		case 1:
    			{
    				string next;
    				next = "n";
    				while(next == "n")
    				{
    					string en;
    					string de;
    					cout << "Englisch: ";
    					std::getline(std::cin,en);
    					cout << "Deutsch: ";
    					std::getline(std::cin,de);
    					a.add(en,de);
    					cout << "|N|ext? Any other key aborts!";
    					cin >> next;
    				};
    				a.safe();
    				break;
    			}
    		case 2:
    			{
    				go = false;
    				break;
    			}
    		default:
    			{
    				cout << "Falsche Eingabe\n" << endl;
    			}
    		};
    	};
    };
    

    nochmal die Funktionen add und safe die darin gebraucht werden:

    void trainer::add(string e, string d)
    {
    	vokabel *tmp = vok;
    	++anzahl;
    	vok = new vokabel[anzahl];
    	for(int i=0;i<(anzahl-1);++i)
    	{
    		vok[i] = tmp[i];
    	}
    	vok[anzahl-1].deu = d;
    	vok[anzahl-1].engl = e;
    	delete [] tmp;
    }
    
    void trainer::safe()
    {
    	ofstream out("vok.txt");
    	for(int i=0;i < anzahl;++i)
    	{
    		out << vok[i].engl << ";" << vok[i].deu;
    		if(i != (anzahl-1)) out << endl;
    	};
    	out.close();
    };
    
    struct vokabel
    {
    	string engl;
    	string deu;
    };
    

    So, folgendes Problem:
    Wenn ich Vokabeln eingeben will, dann sieht das bei mir folgendermaßen aus:

    (1)Vokabeln hinzufuegen
    (2)Hauptmenu
    1

    Englisch: to dress
    Deutsch: kleiden
    |N|ext? Any other key aborts!(1)Vokabeln hinzufuegen
    (2)Hauptmenu

    Woran liegt das, das er die Abfrage von Next überspringt?



  • Ich glaube bei dir steht noch das Enter-Zeichen im Puffer, schreibe

    std::cin.get();
    

    Nach der Zeile

    std::getline(std::cin, de);
    

    //edit:
    Zweimal std:: vergessen 😉

    Caipi



  • nach nem getline steht da kein enter-zeichen mehr im puffer... sieht nach VC++ getline-Bug aus.



  • habs so abgeändert wie Caipi geschrieben hat, Fehler bleibt aber der gleiche (habs auch nochmal direkt hinter "std::getline(std::cin, en);" eingefügt, keine Verbesserung)

    ps: wenn sich jemand fragt, was das hier mit endlosschleifen zu tun hat... das war ein Fehler von mir *G* wollte ursprünglich ein anderes Problem schildern, welches sich aber bereits gelöst hat. Vergaß dann die Überschrift zu ändern



  • versuch mal den fehler zu reduzieren...
    was macht denn nur:

    getline(cin, a);
    getline(cin, b);

    Wie gesagt, wenn du den VC++ hast, liegts vielleicht daran.



  • einmal wie DrGreenthumb schon sagt, fix mal das studio, den stlfix gibt es auf hume sikkins seite
    zum zweiten leere mal den buffer von restzeichen:

    cin.clear();
     cin.ignore(numeric_limits<streamsize>::max(), '\n');//oder INT_MAX
    


  • ohne std:: passiert genau das selbe.
    Wenn ich den Code von elise einfüge bekomme ich die Fehlermeldungen:

    C:\Eigene Dateien\Vokabeltrainer\main.cpp(30) : error C2065: 'numeric_limits' : nichtdeklarierter Bezeichner
    C:\Eigene Dateien\Vokabeltrainer\main.cpp(30) : error C2275: "streamsize" : Ungültige Verwendung dieses Typs als Ausdruck
    d:\programme\microsoft visual studio\vc98\include\iosfwd(21) : Siehe Deklaration von 'streamsize'
    C:\Eigene Dateien\Vokabeltrainer\main.cpp(30) : error C2039: 'max' : Ist kein Element von '`global namespace''
    C:\Eigene Dateien\Vokabeltrainer\main.cpp(30) : error C2065: 'max' : nichtdeklarierter Bezeichner
    C:\Eigene Dateien\Vokabeltrainer\main.cpp(34) : error C2275: "streamsize" : Ungültige Verwendung dieses Typs als Ausdruck
    d:\programme\microsoft visual studio\vc98\include\iosfwd(21) : Siehe Deklaration von 'streamsize'

    evtl brauch ich noch ne header die ich net drin hab?

    achja, und wo genau finde ich " hume sikkins seite"? 🙂

    danke



  • Twister schrieb:

    achja, und wo genau finde ich " hume sikkins seite"?

    Humes Seite 🙂



  • so... vielen Dank 🙂 habs grad mal runtergeladen und der Code sieht wie folgt aus:

    while(next == "n")
    {
          string en;
    	string de;
    	cout << "Englisch: ";
    	getline(cin,en);
    	cout << "Deutsch: ";
    	getline(cin,de);
    	a.add(en,de);
    	cout << "|N|ext? Any other key aborts!";
    	cin >> next;
    };
    

    ... hat bewirkt, dass die Next-Frage nicht mehr übersprungen wird... dafür aber die Eingabe der Englisch-Vokabel 😃
    Habs auch schon mit std:: getestet.


Anmelden zum Antworten