Dividir cadena de acuerdo a un delimitador en C++

Publicado por Camila
hace 10 años

<p>Hola a todos! Me gustaría saber cuál sería la mejor forma de dividir un string de acuerdo a un delmitador. Me gustaría que las partes resultantes se guarden en un vector. Necesito algo como lo siguiente:</p>

<pre class="prettyprint"> string texto = "Hola a todos; Mi nombre es Camila; Soy de Buenos Aiers";

// Ahora quiero dividir este texto en 3 partes, separadas por el punto y coma vector = dividir_texto( texto, ";" );

// Y me quedaría algo como esto vector[ 0 ] = "Hola a todos"; vector[ 1 ] = "Mi nombre es Camila"; vector[ 2 ] = "Soy de Buenos Aires";</pre>

<p>Gracias.<br />  </p>

c++
Respuesta de Laura
hace 10 años

<p>Hola Cami. Hay muchas formas de lograr eso. Mira esta función de ejemplo:</p>

<pre class="prettyprint"> vector<string> split( string texto, string delimitador ) { size_t posicion = 0; vector<string> resultado; while( ( posicion = texto.find( delimitador ) ) != string::npos ) { resultado.push_back( texto.substr( 0, posicion )); texto.erase( 0, posicion + delimitador.length()); } resultado.push_back( texto ); return resultado; }

// Aquí se guardarían los tramos vector<string> tramos = split( "Hola a todos; Mi nombre es Camila", ";" );</pre>

<p>Con esta función lo que se hace es buscar el delimitador dentro del texto con la función find de la clase string. Luego se copia ese tramo, desde el comienzo hasta la posición en la que fue encontrado el delimitador, y se guarda en el vector. Después se borra ese tramo del texto original y se repite el procedimiento hasta que se haya "recortado" todo el texto.</p>

<hr /><p>De todas formas no me parece bueno tener que reinventar la rueda. Creo que hay que utilizar funciones que ya estén desarrolladas, por ejemplo la función split de las librerías Boost ( deberías tener esta librería instalada ). Es mucho más práctico. Ejemplo:</p>

<pre class="prettyprint">

include <boost/algorithm/string.hpp>

vector<string> tramos; boost::split( tramos, "Hola a todos; Mi nombre es Camila", boost::is_any_of( ";" ));</pre>

<p>Saludos.</p>