Problem bei Vektorelementen
-
Hallo,
momentan bin ich bei der Übung 3.14 auf Seite 128 im C++ Primer vierte Auflage.
Hier einmal die Aufgabenstellung:"Lesen Sie Text in einen Vektor ein
und speichern Sie jedes Wort der Eingabe als Vektorelement. Verwandeln Sie die
Wörter in Großbuchstaben. Geben Sie die umgewandelten Elemente in Zeilen zu je acht Wörtern aus."Das ist bei mir dabei herausgekommen:
#include <iostream> #include <vector> #include <string> using namespace std; int main() { vector<string> word_vec; string text_str; getline(cin, text_str); for(string::size_type ix=0; ix <= text_str.size(); ++ix) { int x=0; int f=0; if(!(isspace(text_str[f]))) { word_vec[x].push_back(text_str[f]); } else if(isspace(text_str[f])) { ++x; } ++f; } return 0; }Der Code wird vom meinem Compiler g++ kompiliert. Nach der Eingabe des Textes
meldet Windows das das Programm nicht mehr funktioniert.
Also hab ich die Vektoren gegen arrays getauscht.#include <iostream> #include <vector> #include <string> using namespace std; int main() { string word_vec[20]; //testweise 20 string text_str; getline(cin, text_str); for(string::size_type ix=0; ix <= text_str.size(); ++ix) { int x=0; int f=0; if(!(isspace(text_str[f]))) { word_vec[x].push_back(text_str[f]); } else if(isspace(text_str[f])) { ++x; } ++f; } for(int i=0; i != 19; ++i) { cout << word_vec[i] << endl; } return 0; }Hier meldet Windows keine Fehler aber cout gibt mir den Anfangsbuchstaben des
strings aus. Was hab ich falch gemacht ? Vielen Dank schonmal im Voraus.
-
Du gehst durch das <= in der Abbruchbedingung schon einmal mindestens einen Schritt zu weit. Ich hätte mich an deiner Stelle übrigens stärker an der Aufgabenstellung orientiert: Mit operator>> kannst du wie Wörter gleich getrennt einlesen, anstatt diese fehleranfällig von Hand auseinander zu fummeln. Dann speicherst du sie direkt ab und hinterher schaust du dir deine Wörter noch einmal an und wandelst sie in Großbuchstaben um. Es bietet sich an, für diesen letzten Punkt eine eigene Funktion zu schreiben, das wird übersichtlicher und kann besser getestet werden.
-
ja stimmt da hast du recht. Aber ich weiß immer noch nicht warum mein Programm jetzt nicht funktioniert.
-
Da ist dein Fehler:
word_vec[x].push_back(text_str[f]);Dein Vector ist leer. Du müsstest erst einen String Einfügen, um dann etwas daran anhängen zu können.
-
Könnte der Vektor "word_vec" nicht einfach während des Codes neuen Speicherplatzt für die Buchstaben hinzufügen ?.
-
Keksman schrieb:
Könnte der Vektor "word_vec" nicht einfach während des Codes neuen Speicherplatzt für die Buchstaben hinzufügen ?.
Dir fehlen die Worte

Du müsstest ein leeres Wort einfügen, wenn eine neues Wort anfängt. Aber wenn du es so machen würdest, wie SeppJ es beschrieben hat, würdest du einfach das fertige Wort mit push_back in den Vector einhängen.
word_vec.push_back( word );
-
Ich verstehe nicht genau was Ihr mit der cin>>text Eingabe bewirken wollt. Wie soll ich die die einzelnen Wörter in die Vektoren reinpacken. cin ließt doch nur bis ein Leerzeichen oder ein Tabulator kommt. Und ich verstehe auch nicht warum mein Code unpassend ist. Wenn x um 1 erhöht wird dann muss ja automatisch word_vec neuen Speicherplatzt bekommen. Ich habe aber keine Ahnung wie ich das anstellen soll. Also versuch ich das mal so wie SeppJ mir das vorgeschlagen hat. Ich hab jetzt alles durchprobiert. Ich kriegs nicht hin
Entweder gibst nen Syntaxfehler oder das Programm läuft nicht so wie es soll. Bitte gebt mir einen Tipp.
-
Ein Tipp
#include <iostream> #include <string> int main() { std::string w; while( std::cin >> w ){ std::cout << w << std::endl; } }
-
Kann mir echt keiner eine Antwort geben oder wurde meine Frage schon vorher
beantwortet und ich bin nur zu blöd den Fehler zu beheben ? Ich poste hier nochmal den Code mit Kommentierung.#include <iostream> #include <vector> #include <string> using namespace std; int main() { string word_str[20]; //testweise 20 . gibt natürlich einen Fehler wenn der Satzt mehr als 20 Wörter enthält aber ich bin erstmal froh wenn sich überhaupt was tut. string text_str; // leerer string getline(cin, text_str); // liest von der Standarteingabe for(string::size_type ix=0; ix != text_str.size(); ++ix) // wenn text_str z.B. "Bald ist Weinachten" enthält wird diese Schleife nur 19 mal wiederholt { int x=0; int f=0; if(!(isspace(text_str[f]))) // im ersten Schleifendurchlauf steht hier ja if(!(isspace(text_str[0]))) also wird geprüft ob das erste Zeichen { // im string text_str kein leerzeichen ist. Das ist so und somit wird der erste Buchstabe an den ersten string char gehängt. else if wird übersprungen und f wir um 1 erhöht. Diese Schleife wiederholt sich und wenn es ein leerzeichen gibt dann wird die else if schleife ausgeführt und x wird um 1 erhöht. Somit würde beim nächsten Durchlauf das zweite wort in word_str[1] abgespeichert. Das wiederholt sich ja alles bis die hauptforschleife nicht mehr erfüllt ist weil ix = die größe des strings text_str entsprechen würde. word_str[x].push_back(text_str[f]); } else if(isspace(text_str[f])) { ++x; } ++f; } for(int i=0; i != 20; ++i) { cout << word_str[i] << endl; // hier werden die Wörter dann ausgegeben } return 0; }
-
Danke manni66. so simple und ich bin nicht drauf gekommen
passiert.