Dividir string c++. (split)

publicado por: Anonymous

Buenos días comunidad.

¿Como dividir un string?

Supongamos que:

string cadena = "abc#123#faker";

El procedimiento sería que cuando consiga un “#” asigne a la cadena resultante.
Lo que quiero poder hacer es guardar en otro array string.


void split (string resultado[], string cadena){
//procedure
}

string [2] resultado;
resultado[0] //sea igual a "abc"
resultado[1] //igual a "123"
resultado[2] // "faker" 
//nótese que se guardará sin el carácter "#".

Lo que vendría siendo esto es un método que tenga como parámetros el array de string y la cadena a dividir (split).(para ser más específico esta función vendría siendo el split(“#”) en java)

Me han recomendado que use la función strto de la librería cstring pero es muy ineficiente.

Espero ser específico y que me pueden ayudar en esta duda.


NOTA:
Cualquier recomendación, sugerencia o respuesta es bienvenida.

solución

Antes que nada, incluye las siguientes librerías:

#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>

Aquí un algoritmo fácil, utilizando la función find y substr:

vector<string> split(string str, char pattern) {

    int posInit = 0;
    int posFound = 0;
    string splitted;
    vector<string> resultados;

    while(posFound >= 0){
        posFound = str.find(pattern, posInit);
        splitted = str.substr(posInit, posFound - posInit);
        posInit = posFound + 1;
        resultados.push_back(splitted);
    }

    return resultados;
}

int main()
{
    string str;
    char pattern;
    vector<string> resultados;

    cin >> str;
    cin >> pattern;

    resultados = split(str, pattern);

    for(int i = 0; i < resultados.size(); i++){
        cout << resultados[i] << endl;
    }

    return (0);
}

La lógica es la siguiente:

  1. Se declara la variable posInit para almacenar la posición inicial y obtener el siguiente substring.

  2. Se declara la variable posFound que sirve para buscar el siguiente caracter patrón o simbolo.

  3. Mientras la posición (posFound) sea válida, el algoritmo irá buscando la posición en que se encuentre el patrón después de la posición inicial.

  4. La variable splitted almacenará el valor temporal del substring encontrado para guardarlo en el vector de resultados.

  5. Para obtener ese substring, le pasamos la posición inicial y la posición encontrada – poisición inicial. ejemplo: si encontré el patrón en la posición 12 de un string y tengo mi posición inicial en la posición 6, el substring será inicio en posición 6 y concateno los siguientes 12-6 caracteres.

  6. Una vez obtenido el substring, vuelvo la siguiente posición inicial, la posición del patrón encontrado y sumo 1, ya que find me devuelve la posición del patrón y el patrón no lo quiero incluir en mi substring.

  7. Agrego el substring a la lista de resultados.

posFound devolverá -1 porque posInit irá aumentando el valor hasta no encontrar más patrones.

Asegurate de enviar el patrón y el string, si no, valídalo como desees, Saludos.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *