Java verfügt über eine praktische Split-Methode:
String str = "The quick brown fox";
String[] results = str.split(" ");
Gibt es eine einfache Möglichkeit, dies in C++ zu tun?
Java verfügt über eine praktische Split-Methode:
String str = "The quick brown fox";
String[] results = str.split(" ");
Gibt es eine einfache Möglichkeit, dies in C++ zu tun?
Viele übermäßig komplizierte Vorschläge hier. Versuchen Sie diese einfache std::string Lösung:
using namespace std;
string someText = ...
string::size_type tokenOff = 0, sepOff = tokenOff;
while (sepOff != string::npos)
{
sepOff = someText.find(' ', sepOff);
string::size_type tokenLen = (sepOff == string::npos) ? sepOff : sepOff++ - tokenOff;
string token = someText.substr(tokenOff, tokenLen);
if (!token.empty())
/* do something with token */;
tokenOff = sepOff;
}
Ich weiß, dass diese Frage bereits beantwortet wurde, aber ich möchte einen Beitrag leisten. Vielleicht ist meine Lösung ein bisschen einfach, aber das ist, was ich mir ausgedacht habe:
vector<string> get_words(string const& text, string const& separator)
{
vector<string> result;
string tmp = text;
size_t first_pos = 0;
size_t second_pos = tmp.find(separator);
while (second_pos != string::npos)
{
if (first_pos != second_pos)
{
string word = tmp.substr(first_pos, second_pos - first_pos);
result.push_back(word);
}
tmp = tmp.substr(second_pos + separator.length());
second_pos = tmp.find(separator);
}
result.push_back(tmp);
return result;
}
Bitte kommentieren Sie, wenn es einen besseren Ansatz für etwas in meinem Code gibt oder wenn etwas falsch ist.
UPDATE: Generisches Trennzeichen hinzugefügt
Hier ist ein Ansatz, mit dem Sie steuern können, ob leere Token eingeschlossen (wie strsep) oder ausgeschlossen (wie strtok) werden.
#include <string.h> // for strchr and strlen
/*
* want_empty_tokens==true : include empty tokens, like strsep()
* want_empty_tokens==false : exclude empty tokens, like strtok()
*/
std::vector<std::string> tokenize(const char* src,
char delim,
bool want_empty_tokens)
{
std::vector<std::string> tokens;
if (src and *src != '\0') // defensive
while( true ) {
const char* d = strchr(src, delim);
size_t len = (d)? d-src : strlen(src);
if (len or want_empty_tokens)
tokens.push_back( std::string(src, len) ); // capture token
if (d) src += len+1; else break;
}
return tokens;
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
234 Stimmen
Ich kann nicht glauben, dass diese Routineaufgabe in C++ so viel Kopfzerbrechen macht
6 Stimmen
Seine nicht Kopfschmerzen in C + + - es gibt verschiedene Möglichkeiten, um es zu erreichen. Programmierer sind weniger bewusst, C + + als c # - seine über Marketing und Investitionen ... siehe dies für verschiedene C + + Optionen, um das gleiche zu erreichen: cplusplus.com/faq/sequenzen/strings/split
11 Stimmen
@hB0 gehen durch viele Fragen Antworten und immer noch nicht entscheiden, bedeutet, ist ein Kopfschmerz. die eine braucht, dass die Bibliothek, die andere ist nur für Leerzeichen, die andere nicht behandeln Leerzeichen.
3 Stimmen
Mögliches Duplikat von Eine Zeichenkette in C++ aufteilen?
8 Stimmen
Warum muss in C++ alles ein Kampf sein?
2 Stimmen
C++ ist eine leistungsfähige Sprache, die keine Einheitslösung für die Zeichenkettenmanipulation bietet. Für diese Anwendung ist manchmal alles, was Sie wollen, das letzte Token oder die ersten paar Token, aber ein "Split" wird alles tokenisieren, ohne bedarfsorientierte Stopps. Unabhängig davon sind String-Operationen in jeder Sprache teuer, und deshalb hat sich der C++-Standard ausdrücklich gegen übermäßig vereinfachende Schnittstellen ausgesprochen, die die wahre Komplexität verbergen.
0 Stimmen
@JohnPhuNguyen:
a "split" will tokenize everything without any need-based stops
. Kein Scherz. Das ist genau das Verhalten, das erwünscht ist.1 Stimmen
Interessanterweise sind alle Antworten auf diese Frage auch Antworten auf
Why are Java and Python so much more popular than C++?
.1 Stimmen
@stackoverflowuser2010 Ich glaube, Sie haben den Punkt nicht verstanden. Ja, das ist genau das Verhalten, das bei einem einheitlichen Ansatz erwünscht ist, was ich auch gesagt habe. Und es ist relevant für die Antwort auf die Frage, warum es in Java einfacher zu machen ist als in C++. Die CPP-Standardbibliothek vermeidet explizit alle Komfortmethoden, die die algorithmische Komplexität abstrahieren - deshalb können One-Size-Fits-All-Methoden angeboten werden, werden aber nicht angeboten.
0 Stimmen
@JohnPhuNguyen: Ich verstehe nicht, was Sie meinen mit
one size fits all
. In dieser Frage gibt es nur eine Größe: Tokenize a string. Es gibt keine andere Größe.0 Stimmen
@stackoverflowuser2010 Was ich meine ist, dass die Tokenisierung eine teure Funktion ist, die oft generisch verwendet wird, auch wenn sie nicht benötigt wird. C++ fördert die Implementierung spezifischer Anwendungsfälle anstelle der Tokenisierung, da der eigentliche Akt der Tokenisierung selten benötigt wird. Es wird oft als Mittel verwendet, um etwas in einer Zeichenkette zu finden. Stattdessen bietet C++ (unter anderem) Regex-Matching, das zwar teuer ist, aber bei weitem nicht so teuer wie die String-Manipulation, die in Tokenizern stattfindet. Ja, ein Tokenizer wird leicht für jede Lösung passen, aber er ist selten die beste Lösung. C++ rät davon ab, diesen Weg zu gehen.
1 Stimmen
Eine Lösung für genau diese Frage scheint hier zu liegen: riptutorial.com/cplusplus/example/2148/tokenize