howto:split_string
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | howto:split_string [2020-07-27 09:36] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Text mit Trennfolgen zergliedern ====== | ||
+ | > // Teach a man to fish and you feed him for a lifetime. // | ||
+ | > // Unless he doesn' | ||
+ | >> --- http:// | ||
+ | ===== Aufgabe ===== | ||
+ | Eine Textzeichenkette ist in eine Folge von Teilen zu zerlegen, | ||
+ | zwischen denen jeweils eine feststehende Zeichenfolge zu finden ist. | ||
+ | Aus | ||
+ | "1, 2, 3, 4, 5" | ||
+ | werden mit der Trennzeichenfolge ", " die 5 Teilketten | ||
+ | " | ||
+ | Die gewünschte Funktion '' | ||
+ | ===== Ein Ansatz in C++98 ===== | ||
+ | <code cpp split.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | std:: | ||
+ | split(std:: | ||
+ | { | ||
+ | std:: | ||
+ | std:: | ||
+ | |||
+ | while (std:: | ||
+ | { | ||
+ | result.push_back(input.substr(start, | ||
+ | start = position + separator.size(); | ||
+ | } | ||
+ | |||
+ | result.push_back(input.substr(start)); | ||
+ | return result; | ||
+ | } | ||
+ | </ | ||
+ | Eine [[http:// | ||
+ | Für einzelne Separatorzeichen aus einer Liste vgl. http:// | ||
+ | |||
+ | ===== Leichtgewichtiger in C++17 ===== | ||
+ | Das Kopieren von Zeichenketten ist aufwendig. | ||
+ | Mit [[kennen: | ||
+ | Voraussetzung ist, dass die zu zerlegende Teilzettenkette mindestens solange existiert, wie per '' | ||
+ | <code cpp split_sv.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | auto split(std:: | ||
+ | { | ||
+ | std:: | ||
+ | std:: | ||
+ | |||
+ | while (std:: | ||
+ | { | ||
+ | result.push_back(input.substr(start, | ||
+ | start = position + separator.size(); | ||
+ | } | ||
+ | |||
+ | result.push_back(input.substr(start)); | ||
+ | return result; | ||
+ | } | ||
+ | </ | ||
+ | Hier wird eine ganze Zeichenkette als Trenner erwartet. | ||
+ | In diesem Beispiel werden die Zeichenfolgen ", " | ||
+ | der Eingabe '' | ||
+ | ein einzelnes Komma jedoch nicht: | ||
+ | <code cpp> | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | std::string line; | ||
+ | while (std:: | ||
+ | { | ||
+ | for (auto part : split(line, ", ")) // C++11 | ||
+ | { | ||
+ | std::cout << " | ||
+ | } | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Reguläre Ausdrücke als Trenner ===== | ||
+ | [[kennen: | ||
+ | Hier eine C++17-Variante mit '' | ||
+ | <code cpp split_regex_sv.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // adapted from: http:// | ||
+ | |||
+ | auto split(std:: | ||
+ | { | ||
+ | std:: | ||
+ | std::regex rex(separator.begin(), | ||
+ | std:: | ||
+ | std:: | ||
+ | // -1 : get stuff not matched by regex | ||
+ | for (; iter != end; ++iter) | ||
+ | { | ||
+ | std:: | ||
+ | result.push_back({iter-> | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | for (auto e : split(" | ||
+ | { | ||
+ | std::cout << e << ' | ||
+ | } | ||
+ | |||
+ | for (auto e : split(" | ||
+ | { | ||
+ | std::cout << e << ' | ||
+ | } | ||
+ | } | ||
+ | </ | ||
howto/split_string.txt · Zuletzt geändert: 2020-07-27 09:36 von 127.0.0.1