String in for schleife einlesen



  • Hallo,

    ich lerne derzeit C++ und wollte mir zur Übung ein kleines Programm schreiben, um meine Durchschnittsnote im Studium zu berechnen.
    Dazu möchte ich zunächst die Fächer mithilfe einer for-Schleife einlesen (Fachname, note und Credits) und falls man 'exit' als Fachname eintippt soll die Schleife abgebrochen werden.
    Leider kann man schon beim 2ten Schleifendruchlauf mit getline keinen Fachnamen mehr eingeben.
    benutze ich statt getline einfach cin << var; funktioniert meine Eingabeschleife zwar, aber ich kann natürlich in den String keine 'Leerzeichen' einlesen.
    Debuggen brachte mich auch nicht wirklich weiter.

    Hier ist aufjeden Fall schonmal mein Code:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    //globale Variablen
    string name[12];
    double note[12];
    int credits[12];
    
    double durchschnittsnote();
    
    int main()
    {
    	//Einlesen der Werte;
    	cout << "Geben Sie Ihre Daten ein: " << endl
    		 << "Zum Beenden der Eingabe geben Sie 'exit' ein." << endl << endl;
    
    	for(int i=0; i<12 ; i++)
    	{
    		cout << endl << i+1 << "Fach:" << endl
    							<< "Name: ";
    		cin >> name[i];
    		//getline(cin, name[i]);
    
    		if(name[i] == "exit")
    			break;
    		else 
    		{
    			cout << "Credits: ";
    			cin >> credits[i];
    			cout << "Note: ";
    			cin >> note[i];
    
    		}
    	}
    
    	return 0;
    }
    

    Vielleicht hat jemand von euch einen Tip für einen Anfänger.

    Danke schonmal und Gruß

    Alex



  • Hallo,

    das ist immer blöd, da nicht sehr intuitiv.
    Jedenfalls bleibt nach dem cin >> note[i] das newline ('\n') im Puffer.
    Mach mal dahinter ein cin.ignore(256, '\n') und dann das getline wieder rein.



  • Hallo,

    hier ein Beispiel um eine Zeile einzulesen die max. 255 Zeichen beinhalten kann.

    std::string name(256, '\0');
    std::cin.getline(&name.front(), name.size() - 1);
    

    Der Code funktioniert bei mir, evtl. gibts für diese Fragestellung allerdings auch noch eine bessere Variante.

    Viele Grüße



  • Jockelx schrieb:

    Hallo,

    das ist immer blöd, da nicht sehr intuitiv.
    Jedenfalls bleibt nach dem cin >> note[i] das newline ('\n') im Puffer.
    Mach mal dahinter ein cin.ignore(256, '\n') und dann das getline wieder rein.

    Hallo,

    vielen Dank das cin.ignore(...) funktioniert.

    Bin erst seit kurzem dran C++ zu lernen, aber genau mit solchen selbst ausgedachten Programmen schafft man es sich die Syntax und die auftretenden Problem zu verinnerlichen.

    Gruß

    Alex



  • Wurde ja schon gesagt: da bleibt ein newline ('\n') im Stream.
    operator>>() überspringt führenden Weißraum, std::getline() nicht.
    Lösung wäre das führende newline mit std::ws aus dem stream zu entfernen, bevor man getline() darauf aufruft.

    #include <iostream>
    #include <istream> // std::ws
    #include <string>
    
    using namespace std;
    
    //globale Variablen
    string name[12];
    double note[12];
    int credits[12];
    
    double durchschnittsnote();
    
    int main()
    {
      // ...
      getline(cin>>ws, name[i]);
      // ...
    }
    

Log in to reply