Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: gomezjuan en 17 Mayo 2020, 15:17 pm



Título: Dividir cadena en subcadena C++
Publicado por: gomezjuan en 17 Mayo 2020, 15:17 pm
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


Título: Re: Dividir cadena en subcadena C++
Publicado por: EdePC en 17 Mayo 2020, 18:39 pm
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
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main() {
  7.  string txt = "ajndfvaorncak89s";
  8.  for (int i = 1; i <= txt.size(); i++) {
  9.    cout << txt[i-1];
  10.    if (txt[i] == 'a') {
  11.      cout << endl;
  12.    }
  13.  }
  14.  return 0;
  15. }

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


Título: Re: Dividir cadena en subcadena C++
Publicado por: K-YreX en 17 Mayo 2020, 19:27 pm
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.


Título: Re: Dividir cadena en subcadena C++
Publicado por: RayR en 17 Mayo 2020, 20:53 pm
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() (https://en.cppreference.com/w/cpp/string/basic_string/find) y substr() (https://en.cppreference.com/w/cpp/string/basic_string/substr). Un ejemplo para encontrar la primera subcadena:

Código
  1. std::string::size_type inicio, fin = 0;
  2.  
  3. inicio = cadena.find('a', fin);
  4.  
  5. // Si se encontro una letra 'a'
  6. if (inicio != std::string::npos) {
  7.  fin = cadena.find('a', inicio + 1);
  8.  subcadena = cadena.substr(inicio, fin - inicio);
  9. }

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


Título: Re: Dividir cadena en subcadena C++
Publicado por: gomezjuan en 18 Mayo 2020, 12:53 pm
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.