2010-02-16 185 views
12

posibles duplicados:
C++: How to split a string?
Splitting a stringSeparar una cadena por espacios en blanco en C++

¿Cuál es la mejor manera de ir sobre la división de una cuerda hacia arriba por espacios en blanco en C++?

Me gustaría poder dividirlo según la pestaña, el espacio, etc. y, por supuesto, ignorar varias pestañas/espacios/etc. en una fila, así como no tener problemas para tener esas cosas al final.

En última instancia, voy a terminar almacenando esto en un vector, pero puedo convertir fácilmente entre los tipos de datos si hay alguna manera de biblioteca incorporada estándar fácil de dividir.

Estoy construyendo esto en una máquina UNIX con g ++, no utilizando Microsoft Visual C++

+2

Ver: http://stackoverflow.com/questions/236129/c-how-to-split-a-string – kennytm

+2

y http://stackoverflow.com/questions/909289/splitting-a-string – Potatoswatter

+5

Esta pregunta me hizo darme cuenta de cuánto pitón hizo mi vida más fácil. – dassouki

Respuesta

11

Bien puede ser excesiva para este problema en particular, pero tenga en cuenta Boost.Regex.

(Honestamente, probablemente podría escribir un guión que respondiera a cada pregunta de C++ sobre SO con 'use Boost', y salir adelante en karma. Pero realmente ayuda).

+3

+1 para su segundo párrafo. No podría dejarlo sin mayor representante para eso. –

+1

Me doy cuenta de que esto fue publicado hace mucho tiempo, pero tuve ganas de comentar. Sé que no todos son como yo, pero me gusta recrear la rueda ... A veces recibo respuestas a las preguntas que hago, que dicen "use boost", pero quiero saber por qué o cómo funciona algo, y cómo implementarlo yo mismo. Claro, si tiene que enviar un producto rápidamente, dado que las características de refuerzo ya están probadas y son confiables, definitivamente es una buena opción. Sin embargo, si tiene tiempo para aprender cómo implementar las características de esas características, le brinda un conjunto de habilidades inestimable. Entonces, no cree ese script;) a menos que sea urgente. –

+0

Es por eso que nunca voto las respuestas que usan boost. –

15

Puede ser discutible si se trata de mejor, pero realmente fácil manera de hacer esto es poner su cadena en un stringstream, a continuación, leer los datos de vuelta:

// warning: untested code. 
std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input); 
    std::vector<std::string> ret; 

    std::copy(std::istream_iterator<std::string>(buffer), 
       std::istream_iterator<std::string>(), 
       std::back_inserter(ret)); 
    return ret; 
} 

Si lo prefiere, puede inicializar el vector directamente de los iteradores:

std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input); 
    std::vector<std::string> ret((std::istream_iterator<std::string>(buffer)), 
           std::istream_iterator<std::string>()); 
    return ret; 
} 

O debería funcionar con cualquier compilador de C++ razonable. Con C++ 11, se puede limpiar la segunda versión un poco mediante el uso de ortesis-inicialización lugar:

std::vector<std::string> ret{std::istream_iterator<std::string>(buffer), 
           std::istream_iterator<std::string>()}; 
+0

Preferiría 'std :: istringstream', pero por lo demás es bueno. +1 – sbi

7

Esto es lo que yo uso:

/* Tokenizing a string */ 
    std::vector<std::string> Parser::tokenizer(const std::string& p_pcstStr, char delim) { 
     std::vector<std::string> tokens; 
     std::stringstream mySstream(p_pcstStr); 
     std::string   temp; 

     while(getline(mySstream, temp, delim)) { 
      tokens.push_back(temp); 
     } 

     return tokens; 
    } 

Su delim sería un espacio en blanco, p_pcstStr sería la cadena para tokenizar y el retorno sería un vector con todas las cadenas que tienen un espacio en blanco en el medio.

+2

+ 1 para agregar un parámetro de delimitador – crocboy

Cuestiones relacionadas