2010-08-26 15 views
7

Quiero utilizar el Tokenizer de cadena para la cadena CPP, pero todo lo que pude encontrar fue para Char *. ¿Hay algo similar para la cadena CPP?Tokenizer de cadenas para CPP String?

+17

¿Por qué algunos de los ejemplos de lo 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. –

+0

posible duplicado de [Usando strtok con std :: string] (http://stackoverflow.com/questions/289347/using-strtok-with-a-stdstring) – bobobobo

Respuesta

7

¿Qué quiere decir con "token"? Si es algo separado por cualquier espacio en blanco, los flujos de cadena es lo que quiere:

std::istringstream iss("blah wrxgl bxrcy") 
for(;;) { 
    std::string token; 
    if(!(iss>>token)) break; 
    process(token); 
} 
if(!iss.eof()) report_error(); 

alternativa, si estás buscando un cierto carácter único de separación, se puede reemplazar con iss>>tokenstd::getline(iss,token,sep_char).

Si es más de un carácter que puede actuar como un separador (y si no es espacios en blanco), una combinación de std::string::find_first() y std::string::substr() debería hacer.

+1

+1 por tres alternativas – Chubsdad

+0

¿Hay alguna buena razón para preferir 'for (;;)' sobre 'while (iss >> token)' (suponiendo que 'token' se declaró antes del bucle)? En este ejemplo, sería una línea más corta y, en mi opinión, al menos no menos legible. –

+0

@ Space_C0wb0y: (Solo que ahora entiendo tu comentario. Bueno, al menos creo que sí ...) Prefiero una variable más local sobre la concisión del ciclo 'while'. – sbi

0

Echa un vistazo a algos STL como find_first_of, find_first_not_of y así sucesivamente para crear uno personalizado.

0

Prueba este fragmento que encontré en alguna parte (tal vez incluso por aquí?):

#include <string> 
#include <vector> 
#include <sstream> 

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; 
} 


std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    return split(s, delim, elems); 
} 
Cuestiones relacionadas