Dividir cadena en subcadena C++

Iniciado por gomezjuan, 17 Mayo 2020, 15:17 PM

0 Miembros y 1 Visitante están viendo este tema.

gomezjuan

Si tengo un string =ajndfvaorncak89s'', ¿como puedo dividir la cadena en subcadenas cada vez que llege a una a?
Es decir, dividir esa cadena en:
ajndfv
aornc
ak89s

EdePC

Se me ocurre de la manera más cruda iterar cada caracter hasta encontrar un 'a', en lugar de imprimirlo podrías guardarlo en un Array o Vector...

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>

using namespace std;

int main() {
  string txt = "ajndfvaorncak89s";
  for (int i = 1; i <= txt.size(); i++) {
    cout << txt[i-1];
    if (txt[i] == 'a') {
      cout << endl;
    }
  }
  return 0;
}


CitarC:\Users\EdSon\Desktop>g++ split.cpp -o split.exe && split.exe
ajndfv
aornc
ak89s
C:\Users\EdSon\Desktop>

K-YreX

Además de la opción que ya te ha dado EdePC para la que no necesitas de funciones preexistentes; hay otras opciones como utilizar la función strtok(): https://en.cppreference.com/w/cpp/string/byte/strtok que permite separar una cadena de caracteres en base a una serie de limitadores que puedes establecer tú (en este caso: "a").

Fíjate en su uso ya que es un poco peculiar.

Suerte.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

RayR

Me parece un poco ambiguo lo de cada vez que llegue a una 'a'. O sea, si la cadena no empieza con 'a', como en "xyzajndfvaorncak89s", ¿la primera subcadena debería ser xyz, o ajndfv? Como lo planteas parecería que es la primera, pero a mí me parece más lógica la segunda, así que me enfoco en ella.

Una opción es la función strtok, que ya te mencionaron, pero ten en cuenta que es para cadenas de C (arreglos o punteros char). Aunque hay forma de acceder al buffer interno de string, por varias razones podría no funcionar con strtork, además de que esta función es "destructiva"; es decir, modifica la cadena origen, por lo que al final tu string quedaría alterado. En todo caso, si quieres usar strtok, sería mejor crear una copia de tu string en un arreglo char, y trabajar sobre ella.

Una alternativa es usar las funciones miembro de string find() y substr(). Un ejemplo para encontrar la primera subcadena:

Código (cpp) [Seleccionar]

std::string::size_type inicio, fin = 0;

inicio = cadena.find('a', fin);

// Si se encontro una letra 'a'
if (inicio != std::string::npos) {
 fin = cadena.find('a', inicio + 1);
 subcadena = cadena.substr(inicio, fin - inicio);
}


Ya sólo te faltaría crear el programa y hacer un bucle basándote en esto.

gomezjuan

Vale, muchas gracias.
La cadena la introduce el usuario por consola y he controlado la entrada para que siempre empiece por a, si el usuario introduce la cadena que tu has dado me daría error y finalizaría problema.