-1

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.

Cookie Rabbit
  • 151
  • 2
  • 4
  • 19
  • No sabia de la existencia de la pregunta, pero aun asi no comprendo la solución planteada en esa pregunta. :/ – Cookie Rabbit Apr 20 '17 at 03:12
  • Hay varias soluciones, todas ellas resuelven tu problema de una u otra forma. No tiene sentido esta pregunta si la cuestion ya fue resuelta en otro hilo. Si niguna respuesta te gusta/staisface puedes poner una recompensa y pedir aclaraciones (necesitas un total de 75 puntos). – rnrneverdies Apr 20 '17 at 03:17
  • Te recomiendo la sala de chat, http://chat.stackexchange.com/?tab=site&host=es.stackoverflow.com .. es un lugar apropiado para discusiones extendidas. ¿a cual de todas las soluciones te refieres? – rnrneverdies Apr 20 '17 at 03:32

2 Answers2

2

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> results;
    
    while(posFound >= 0){
        posFound = str.find(pattern, posInit);
        splitted = str.substr(posInit, posFound - posInit);
        posInit = posFound + 1;
        results.push_back(splitted);
    }
    
    return results;
}

int main()
{
    string str;
    char pattern;
    vector<string> results;
    
    cin >> str;
    cin >> pattern;
    
    results = split(str, pattern);
    
    for(int i = 0; i < results.size(); i++){
        cout << results[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.

Andrespengineer
  • 3,002
  • 1
  • 8
  • 18
0

te sugiero revises mi comentario en Leer archivo (.txt) C++

En ese caso se aplicó strtok a una linea leída de archivo, pero el proceso debería ser el mismo. Saludos.

n-angel
  • 21
  • 2