Methode zum aufsplitten von strings
-
Hallo, ich habe versucht eine Methode zu schreiben, die es mir ermoeglicht, einen uebergebenen String anhand eines ebenfalls mit uebergebenen Trennzeichens zu zerschneiden und die einzelnen Stuecke in einen vector zu packen und dann zurueckzugeben. Leider funktioniert sie nicht so ganz, sie endet immer in einer Endlosschleife und ich finde einfach nicht heraus wieso. vielleicht weiss ja jemand einen Rat.
vector<string> split(string eingabe, string trennzeichen) { string::size_type anfang = 0; //stringstueck anfang string::size_type posTrennzeichen = 0; //stringstueck ende string subString; //zwischenspeicher vector<string> rueckgabe; //ergebnisvector posTrennzeichen = eingabe.find(trennzeichen, anfang); //position des trennzeichens bestimmen while ( posTrennzeichen != -1 ) //solange (position des trennzeichens != -1) { subString=eingabe.substr(anfang, (posTrennzeichen-anfang) );//erzeugt nen substring der anfang bis zum trennzeichen enthaelt rueckgabe.push_back(subString); //füge 1. Stringtueck zu rueckgabevector hinzu(von 0 bis zum trennzeichen) anfang = posTrennzeichen + trennzeichen.length(); //mit posTrennzeichen hinter trennzeichen springen } // wenn der string leer ist, dann gibt das -1 (while-bedingung) subString=eingabe.substr(anfang, (eingabe.length()-anfang)); //erstellt 2. Stringstueck rueckgabe.push_back(subString); //füge 2. Stringstück zu rueckgabevector hinzu return rueckgabe; }
-
-
typedef std::vector<std::string> TokenList; TokenList Tokenize (const std::string& str, const std::string& delimiters = " ") { TokenList tokens; //Skip leading delimiters string::size_type lastPos = str.find_first_not_of(delimiters, 0); // Find begin of first token. string::size_type pos = str.find_first_of(delimiters, lastPos); while (string::npos != pos || string::npos != lastPos) { //add token to list tokens.push_back(str.substr(lastPos, pos - lastPos)); // skip next set of delimiters lastPos = str.find_first_not_of(delimiters, pos); // find begin of next token pos = str.find_first_of(delimiters, lastPos); } return tokens; }
-
Komisch, wieso findet man die Loesungen immer dann selbst, wenn man sich dazu durchgerungen hat andere zu fragen...
so funktioniert es:
vector<string> split(string eingabe, string trennzeichen) { string::size_type anfang = 0; //stringstueck anfang string::size_type posTrennzeichen = 0; //stringstueck ende string subString; //zwischenspeicher vector<string> rueckgabe; //ergebnisvector //#### Hier geaendert ### //posTrennzeichen = eingabe.find(trennzeichen, anfang); //position des trennzeichens bestimmen //#### Hier geaendert ### while ((posTrennzeichen = eingabe.find(trennzeichen, anfang)) != -1 ) //solange (position des trennzeichens != -1) { subString=eingabe.substr(anfang, (posTrennzeichen-anfang) );//erzeugt nen substring der anfang bis zum trennzeichen enthaelt rueckgabe.push_back(subString); //füge 1. Stringtueck zu rueckgabevector hinzu(von 0 bis zum trennzeichen) anfang = posTrennzeichen + trennzeichen.length(); //mit posTrennzeichen hinter trennzeichen springen } // wenn der string leer ist, dann gibt das -1 (while-bedingung) subString=eingabe.substr(anfang, (eingabe.length()-anfang)); //erstellt 2. Stringstueck rueckgabe.push_back(subString); //füge 2. Stringstück zu rueckgabevector hinzu return rueckgabe; }
-
danke euch, ich wollte meine eigene Methode zum Laufen bringen, ist sonst auf die Dauer frustrierend...
-
neogeo78 schrieb:
Komisch, wieso findet man die Loesungen immer dann selbst, wenn man sich dazu durchgerungen hat andere zu fragen...
Liegt wahrscheinlich daran, dass man das Problem erstmalig durch die Augen eines Außenstehenden betrachtet, wenn man es für Andere formuliert.
Genereller Tipp: Bei "Endlosschleifen" liegt der Fehler immer darin, dass die Bedingung "falsch" formuliert ist: Entweder ist sie fachlich nicht das Gewünschte oder im Schleifenrumpf werden die Varaiblen nicht korrekt gesetzt (wie bei Dir).
Gruß,
Simon2.