string in mehrere strings aufteilen
-
wie kann ich einen string(z.B. string="dies ist ein test") in mehrere strings aufteilen(z.B. string1="test" string2 ="ist" usw.)? ein string soll nur ein Wort beinhalten.
Danke schon mal im Voraus
-
Hallo
diese Funktion helfen diur dabei :
string.find(...); string.substr(...); string.erase(...);
bis bald
akari
-
könnte mir das einer bitte etwas genauer erklären, also die funktionen
-
Hallo
wieso habe ich das erwartet? okay, also
// Bestimmt die nächste Zeile im Text, Trennzeichen ist RowEnd string GetRow(string &Text, string RowEnd, bool Cut) { TSizeType EndPos = Text.find(RowEnd); // Position des Trennzeichens string Result; // Rückgabeergebnis // Wenn Trennzeichen gefunden, erste Zeile aus Text trennen if (EndPos != string::npos) { Result = Text.substr(0, EndPos); // erste Zeile aus Text an Ergebnis übergeben if (Cut == true) Text.erase(0, EndPos + RowEnd.size()); // Wenn Cut, erste Zeile aus Text löschen } // Wenn kein Trennzeichen gefunden, gesamten Text an Ergebnis übergeben else { Result = Text; // gesamten Text übergeben if (Cut == true) Text = ""; // Wenn Cut, Text löschen } return(Result); } // Einsatz : string Text = "Dies ist ein langer Text mit vielen Wörtern"; // Ausgangstext string Word; // Zwischenspeicher für ein Wort while (Text != "") // Alle Wörter extrahieren, bis Text leer ist { Word = GetRow(Text, " ", true); // nächstes Wort extrahieren // mache mit Word etwas }
bis bald
akari
-
Hallo,
das finde ich recht umständlich. Eleganter gehts mit Stringstreams:
http://www.c-plusplus.net/forum/viewtopic.php?t=66610&highlight=stringstream
-
-
Hallo!
Könnte das eine Lösung für Dich sein? Eine Art StringTokenizer-Klasse, wie in Java? Unterschied zu Java: Die Wörter (=Tokens) werden in einem Vector abgelegt
und können über den Index (z. B. mitstd::string aString = tokens[0]
) ausgelesen werden
//---- Snip (main.cpp) ----- #include <iostream> #include <string> #include <vector> #include "StringTokenizer.h" int main( int argc, char* argv[] ) { std::string str( "dies ist ein test" ); std::vector<std::string> tokens; // Legt jedes Wort von str in ein Feld von tokens. // Kein Delimiter-Argument angeben. Das Leerzeichen ist im Default-Satz enthalten. StringTokenizer::tokenize( str, tokens ); // Jedes Wort an Standard-Out ausgeben // Ausgabe: // dies // ist // ein // test copy( tokens.begin(), tokens.end(), std::ostream_iterator<std::string>(std::cout, "\n")); } // ---- Snip (StringTokenzier.h) ----- #ifndef StringTokenizer #define StringTokenizer #include <string> #include <vector> /** * Statische Tokenisierungsklasse für Strings (std::string). */ class StringTokenizer { private: StringTokenizer(); ~StringTokenizer(); public: static void tokenize( const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters = " \t\n\r\f" ); }; #endif // ---- Snip (StringTokenizer.cpp) ------ #include "StringTokenizer.h" StringTokenizer::StringTokenizer() {}; StringTokenizer::~StringTokenizer() {}; /** * A string tokenizer for the specified std::string str. * If not set to other values, the tokenizer uses the default delimiter set, * which is " \t\n\r\f": the space character, * the tab character, the newline character, the carriage-return * character, and the form-feed character. * Delimiter characters themselves will not be treated as tokens. * Tokens will be stored in tokens. * @param str std::string to be tokenized * @param tokens std::vector<std::string>-Container for the tokens. * @param delimiter Delimiter for tokens. The default set is " \t\n\r\f". */ void StringTokenizer::tokenize( const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters ) { // Skip delimiters at beginning. std::string::size_type lastPos = str.find_first_not_of( delimiters, 0 ); // Find first "non-delimiter". std::string::size_type pos = str.find_first_of( delimiters, lastPos ); while ( std::string::npos != pos || std::string::npos != lastPos ) { // Found a token, add it to the vector. tokens.push_back( str.substr( lastPos, pos - lastPos ) ); // Skip delimiters. Note the "not_of" lastPos = str.find_first_not_of( delimiters, pos ); // Find next "non-delimiter" pos = str.find_first_of( delimiters, lastPos ); } }
Have fun with it...
H.-Gerd
-
Hallo,
nicht, dass ich andere Lösungen missachten wollte, aber erstens halte ich immer noch die stringstream Lösung für eleganter, und zweitens gibt es boost::tokenizer, was ich aufgrund der Bewährtheit einer eigenen Lösung bevorzugen würde.
-
Klar,
die Boost-Library ist gut...
Aber wenn man auf die Einbindung externer Libraries verzichten
möchte (z. B. aus lizenzrechtlichen Gründen), ist eine eigene
Lösung auch nicht falsch. Vorausgesetzt sie funktioniert...Gruß
H.-Gerd
-
Balrog schrieb:
die Boost-Library ist gut...
Aber wenn man auf die Einbindung externer Libraries verzichen
möchte (z. B. aus lizenzrechtlichen Gründen)Verstehe ich nicht, was sollte man den mit der Boost-Lizenz für Probleme haben?
-
An der Boost Licence gibt es auch nichts auszusetzen.
War nur ein genereller Gedanke. Viele Libraries aus
der Open-Source-Gemeinde kann man eben aus
lizenzrechtlichen Gründen schlecht in kommerziellen Projekten
einsetzen.Gruß
H.-Gerd
-
Balrog, sehr hilfreicher Konstruktor und Destruktor die du hast.
-
Hmpf...