2008-11-09 12 views
7

¿Cómo se divide una cadena en tokens en C++?División de cadenas en C++

+0

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

+16

¿Por qué algunos de los ejemplos de la siguiente : http://www.codeproject.com/KB/recipes/Tokenizer.aspx Son muy eficientes y algo elegantes. La biblioteca String Toolkit hace que el complejo procesamiento de cadenas en C++ sea simple y fácil. –

Respuesta

1

Depende de cuán complejo sea el delimitador de tokens y si hay más de uno. Para problemas fáciles, solo use std :: istringstream y std :: getline. Para tareas más complejas o si desea iterar los tokens de una manera compatible con STL, use el Tokenizer de Boost. Otra posibilidad (aunque más desordenada que cualquiera de estos dos) es configurar un ciclo while que llame a std :: string :: find y actualice la posición del último token encontrado para que sea el punto de inicio para buscar el siguiente. Pero esta es probablemente la más propensa a errores de las 3 opciones.

3

Intente utilizar stringstream:

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

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

Compruebe hacia fuera mi respuesta a su última pregunta:
C++ Reading file Tokens

12

esto funciona muy bien para mí :), pone los resultados en elems. delim puede ser cualquier char.

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

Por qué devolver elems. ¿Cuándo se pasa a la función como parámetro de referencia? –

+1

oh, solo por conveniencia. Entonces, si lo necesita, puede hacer algo como: split (line, ',', elems) .at (2); es completamente innecesario devolverlo. –

2

Puede utilizar la función C 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; 
} 

El Boost Tokenizer también hará el trabajo:

#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

Tenga cuidado con strtok en código de subprocesos múltiples. http://www.linuxjournal.com/article/1363 –

5

Con this Mingw distro que incluye Boost:

#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

Vea también impulsar :: separación de 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" }