2008-11-09 5 views
7

Wie teilen Sie eine Zeichenfolge in Tokens in C++?Teilen von Zeichenfolgen in C++

+0

dup von http://stackoverflow.com/questions/236129/c-how-to-split-a-string – ididak

+16

Wie wäre es nur einige der Beispiele aus der folgenden : http://www.codeproject.com/KB/recipes/Tokenizer.aspx Sie sind sehr effizient und etwas elegant. Die String Toolkit Library macht die komplexe String-Verarbeitung in C++ einfach und einfach. –

Antwort

1

Es hängt davon ab, wie komplex der Token-Begrenzer ist und ob es mehrere gibt. Für einfache Probleme verwenden Sie einfach std :: istringstream und std :: getline. Verwenden Sie für komplexere Aufgaben oder wenn Sie die Token STL-konform iterieren möchten, Boost Tokenizer. Eine andere Möglichkeit (obwohl unordentlicher als eine dieser beiden) besteht darin, eine while-Schleife einzurichten, die std :: string :: find aufruft und die Position des zuletzt gefundenen Tokens als Startpunkt für die Suche nach dem nächsten Token aktualisiert. Aber das ist wahrscheinlich die anfälligste der 3 Optionen.

3

Try string mit:

std::string line("A line of tokens"); 
std::stringstream lineStream(line); 

std::string token; 
while(lineStream >> token) 
{ 
} 

überprüfen meine Antwort auf Ihre letzte Frage aus:
C++ Reading file Tokens

12

dies gut funktioniert für mich :), bringt es die Ergebnisse in elems. delim kann jede char sein.

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while(std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 
+1

Warum elems zurückgeben. Wann wird es als Referenzparameter in die Funktion übernommen? –

+1

oh, nur für die Bequemlichkeit. Also, wenn Sie brauchen, können Sie etwas tun wie: Split (Linie, ',', Elems) .at (2); es ist völlig unnötig, es zurückzugeben. –

2

können Sie verwenden, um die C-Funktion strtok:

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] ="- This, a sample string."; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str," ,.-"); 
    while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " ,.-"); 
    } 
    return 0; 
} 

Die Boost Tokenizer tut auch den Job:

#include<iostream> 
#include<boost/tokenizer.hpp> 
#include<string> 

int main(){ 
    using namespace std; 
    using namespace boost; 
    string s = "This is, a test"; 
    tokenizer<> tok(s); 
    for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ 
     cout << *beg << "\n"; 
    } 
} 
+0

Achten Sie auf Strtok in Multi-Thread-Code. http://www.linuxjournal.com/article/1363 –

5

Mit this Mingw distro, die Boost-beinhaltet:

#include <iostream> 
#include <string> 
#include <vector> 
#include <iterator> 
#include <ostream> 
#include <algorithm> 
#include <boost/algorithm/string.hpp> 
using namespace std; 
using namespace boost; 

int main() { 
    vector<string> v; 
    split(v, "1=2&3=4&5=6", is_any_of("=&")); 
    copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n")); 
} 
3

See steigern auch :: Spaltung von String Algo library

 
string str1("hello abc-*-ABC-*-aBc goodbye"); 
vector<string> tokens; 
boost::split(tokens, str1, boost::is_any_of("-*")); 
// tokens == { "hello abc","ABC","aBc goodbye" }