getline bein einem vector string



  • Hallo Community, ich bitte um Verzeihung für diese noob frage, aber ich finde selbst leider keine Lösung für das Problem.

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	vector<string>name(0);
    	vector<int>gesarray(0);
    	int grosse;
    	
    	cout << "Wie groess soll das Array sein? \n";
    	cin >> grosse;
    	cout << endl;
    	gesarray.resize(gesarray.size() + grosse);
    	name.resize(name.size() + grosse);
    	cout << "Nun bitte fuer jedes der " << gesarray.size() << " Array Elemente einen wert eingeben\n";
    	for (int i = 0; i < grosse; i++)
    	{
    		int auswahl;
    		cout << "Bitte Wert fuer das: " << i + 1 << " Elemten eingeben\n";
    		cin >> gesarray.at(i);
    		cout << "\nWert fuer das: " << i + 1 << " Elemtent beträgt nun: " << gesarray.at(i) << endl;
    		cout << "Moechten sie einen Verwendungszweck für das Element eingeben? 0 fuer Nein, 1 fuer Ja\n";
    		do
    		{
    			cin >> auswahl;
    		} while (!(auswahl == 0 || 1));
    		if (auswahl == 1)
    		{
    			cout << "Verwendungszweck eingeben: \n";
    			getline(cin, name.at(i));
    		}
    		else
    		{
    			cout << "es wird ohne Verwendungszweck fortgefahren\n";
    		}
    	}
    	cout << "Es werden nochmal alle Werte der: " << gesarray.size() << " Array Elemente ausgegeben, zusammen mit ihrem individuellen Verwendungszweck\n";
    	for (int i = 0; i < gesarray.size(); i++)
    	{
    		cout << "Das " << i + 1 << " Elemente ist mit dem Wert: " << gesarray.at(i) << " definiert\n";
    		cout << "Verwendungszweck: " << name.at(i) << endl;
    	}
    
    
    	system("pause");
    	return 0;
    }
    

    Meine Frage bezieht sich auf Zeile 33, ich finde einfach keine Möglichkeit eine ganze Zeile einzulesen, mit cin>>name.at(i) wird ja leider nur ein Wort bis zum nächsten Whitespace eingelesen. Und "getline(cin, name.at(i));" wird praktisch einfach ignoriert. Hat jemand ein Tipp wie ich eine ganze Zeile bei einem vector sting einlesen kann?



  • @Delfugos sagte in getline bein einem vector string:

    Und getline(cin, name.at(i)); wird praktisch einfach ignoriert.

    Wird nicht ignoriert. Nach cin >> auswahl; steht noch ein Newline ('\n') im stream das von std::getline() konsumiert wird. Leere den Streambuffer vor std::getline() mit

    #include <limits>
    #include <iostream>
    
    // ...
    
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    // wirft alle Zeichen bis und inkl. des nächsten Newline weg.
    

    @Delfugos sagte in getline bein einem vector string:

    !(auswahl == 0 || 1)
    

    Tut nicht was Du denkst. Du willst

    auswahl != 0 && auswahl != 1
    

    oder

    !(auswahl == 0 || auswahl == 1)
    

    De Morgan's laws

    @Delfugos sagte in getline bein einem vector string:

    	vector<string>name(0);
    	vector<int>gesarray(0);
    

    Die Nullen bitte weglassen, das irritiert nur und bringt nichts.

    @Delfugos sagte in getline bein einem vector string:

    	gesarray.resize(gesarray.size() + grosse);
    	name.resize(name.size() + grosse);
    

    Warum die Größe abfragen? Du weißt doch daß die Dinger leer sind.

    Wenn Du Deine Variablen dort definierst wo es Sinn macht brauchst Du auch kein resize():

    #include <limits>
    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	cout << "Wie grosz soll das Array sein?\n";
    	int groesse;
    	cin >> groesse;
    
    	vector<string> name(groesse);
    	vector<int> gesarray(groesse);
    
    	cout << "\nNun bitte fuer jedes der " << groesse << " Arrayelemente einen Wert eingeben:\n";
    
    	for (int i = 0; i < groesse; ++i) {
    		cout << "\nBitte Wert fuer das " << i + 1 << ". Elemtent eingeben: ";
    		cin >> gesarray[i];  // at() brauchst Du hier nicht, weil Du weißt daß gesarray groß genug ist.
    		cout << "Wert fuer das " << i + 1 << ". Elemtent betraegt nun: " << gesarray[i]
    		     << "\n\nMoechten sie einen Verwendungszweck fuer das Element eingeben? 0 fuer Nein, 1 fuer Ja: ";
    
    		int auswahl;
    		do {
    			cin >> auswahl;
    		} while (auswahl != 0 && auswahl != 1);
    		
    		if (auswahl == 1) {
    			cout << "Verwendungszweck eingeben: ";
    			cin.ignore(numeric_limits<streamsize>::max(), '\n');
    			getline(cin, name[i]);
    		}
    		else {
    			cout << "Es wird ohne Verwendungszweck fortgefahren\n";
    		}
    	}
    
    	cout << "\nEs werden nochmal alle Werte der " << groesse << " Array Elemente ausgegeben, "
    	        "zusammen mit ihrem individuellen Verwendungszweck:\n\n";
    
    	for (int i = 0; i < groesse; ++i) {
    		cout << "\nDas " << i + 1 << ". Elemente ist mit dem Wert " << gesarray[i] << " definiert.\n";
    		if (name[i].length()) {
    			cout << "Verwendungszweck: " << name[i] << "\n\n";
    		}
    		else {
    			cout << "Kein Verwendungszweck.\n\n";
    		}
    	}
    }
    

    Mit Fehlerbehandlung und allgemein etwas C++iger:

    #include <cstddef>
    #include <cctype>
    #include <limits>
    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    struct data_t
    {
    	int value;
    	string name;
    };
    
    istream& operator>>(istream &is, data_t &data)
    {
    	data_t temp;
    
    	if (!(is >> temp.value))
    		return is;
    
    	char dummy;
    	while (is.get(dummy) && isspace(dummy) && dummy != '\n');
    	is.putback(dummy);
    
    	if (!getline(is, temp.name))
    		return is;
    
    	data = temp;
    	return is;
    }
    
    ostream& operator<<(ostream &os, data_t const &data)
    {
    	os << data.value;
    
    	if (data.name.length())
    		 os << ", Verwendungszweck: " << data.name;
    	else os << ", kein Verwendungszweck";
    
    	return os;
    }
    
    void clear_and_ignore(istream &is, char delim = '\n')
    {
    	is.clear();
    	is.ignore(numeric_limits<streamsize>::max(), delim);
    }
    
    int main()
    {
    	size_t size;
    	while (cout << "Wie grosz soll das Array sein?\n",
    	       !(cin >> size) || !size)
    	{
    		cerr << "\nEingabefehler!\n\n";
    		if (!cin)
    			clear_and_ignore(cin);
    	}
    
    	vector<data_t> values{ size };
    
    	cout << "\nNun bitte fuer jedes der " << size << " Arrayelemente einen Wert eingeben:\n";
    	for (size_t i{}; i < size; ++i)
    	{
    		while (cout << "\nBitte Wert und optional Verwendungszweck fuer das " << i + 1 << ". Elemtent eingeben:\n",
    		       !(cin >> values[i]))
    		{
    			cerr << "\nEingabefehler!\n\n";
    			clear_and_ignore(cin);
    		}
    
    		cout << "Wert des " << i + 1 << ". Elemtents betraegt nun: " << values[i].value << '\n';
    		if (!values[i].name.length())
    			cout << "Es wird ohne Verwendungszweck fortgefahren.\n";
    	}
    
    	cout << "\nEs werden nochmal alle der " << size << " Arrayelemente ausgegeben:\n";
    	for (size_t i{}; i < size; ++i)
    		cout << "\nDas " << i + 1 << ". Element:\n" << values[i] << '\n';
    }
    


  • @Swordfish Danke für die Ausführliche Antwort. Deine etwas "C++igere" Antwort verwirrt mich noch etwas^^ ich hoffe das kommt dann im laufe der Zeit, hab jetzt gerade mit dem Informatik Studium angefangen und wollte mich schon etwas im voraus damit beschäftigen. Du scheinst ziemlich gut zu sein, zumindest würde ich das aus deinem Profil schließen^^ Hast du Tipps für jemanden der gerade anfängt C++ zu lernen?



  • @Delfugos sagte in getline bein einem vector string:

    Hast du Tipps für jemanden der gerade anfängt C++ zu lernen?

    Ein gutes Lehrbuch besorgen und durcharbeiten, die C++ Core Guidelines mal gesehen haben. Viel selbst Code schreiben. Wie machst Du es denn bisher?


Log in to reply