2012-04-07 12 views
13

Busco una forma sencilla de tokenize entrada de cadena sin usar las bibliotecas no por defecto, como Boost, etc.C++ Tokenize cadena

Por ejemplo, si el usuario introduce forty_five, me gustaría separar cuarenta y cinco; usando _ como el delimitador.

+1

posible duplicado de [¿Cómo tokenize una cadena en C++?] (http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) – Corbin

+0

http://stackoverflow.com/a/236803/240633 – ergosys

Respuesta

26

para convertir una cadena a un vector de fichas (seguro para hilos):

std::vector<std::string> inline StringSplit(const std::string &source, const char *delimiter = " ", bool keepEmpty = false) 
{ 
    std::vector<std::string> results; 

    size_t prev = 0; 
    size_t next = 0; 

    while ((next = source.find_first_of(delimiter, prev)) != std::string::npos) 
    { 
     if (keepEmpty || (next - prev != 0)) 
     { 
      results.push_back(source.substr(prev, next - prev)); 
     } 
     prev = next + 1; 
    } 

    if (prev < source.size()) 
    { 
     results.push_back(source.substr(prev)); 
    } 

    return results; 
} 
+0

+ 1 Mucho más atractivo que las cosas más populares con las que me relacioné. – ergosys

+0

@ergosys gracias. –

+0

+1 por elegancia – eeerahul

1

Puede usar la función strtok_r, pero lea cuidadosamente las páginas man para que comprenda cómo mantiene el estado.

1

Mira this tutorial, que es con mucho el mejor tutorial sobre tokenización que he encontrado hasta ahora. Abarca las mejores prácticas en la implementación de diferentes métodos que incluyen el uso de getline() y find_first_of() en C std ++, y strtok() en C.