Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JonaLamper en 15 Octubre 2015, 15:26 pm



Título: Cómo convertir un string en una lista de strings
Publicado por: JonaLamper en 15 Octubre 2015, 15:26 pm
Buenas,

Supongamos que tengo el string:

"Pablito clavo un clavito en la calva de un calvito"

y quiero sacar (sin usar un bucle) una lista de strings con cada una de las palabras, algo así:

Pablito
clavo
un
clavito
en
la
calva
de
un
calvito


¿Cómo podría hacerlo?


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: engel lex en 15 Octubre 2015, 15:47 pm
a menos que uses alguna funcion de librería tipo split (que internamente igual es un ciclo) o que uses un template (que tambien es un ciclo, solo que "oculto")... tienes que hacer un ciclo...


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: ivancea96 en 16 Octubre 2015, 10:25 am
Otra opción es usar recursividad, haciendo una función, y llamándose a si misma, dividiendo en cada llamada un espacio.


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: geeke en 17 Octubre 2015, 16:12 pm
Tambien puedes usar goto de esta forma

Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.    char str[] = "Pablito clavo un clavito en la calva de un calvito";
  6.    size_t i = 0;
  7.  
  8. start:
  9.    if (str[++i] == '\0')
  10.        goto end;
  11.    if (str[i] == ' ')
  12.        str[i] = '\n';
  13.    goto start;
  14. end:
  15.    printf("%s\n", str);
  16.  
  17.    return 0;
  18. }
  19.  


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: engel lex en 17 Octubre 2015, 16:21 pm
goto no deja de ser un ciclo (terriblemente aplicado)


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: ivancea96 en 17 Octubre 2015, 17:24 pm
A todo esto, en la librería <algorithm> de C++, tienes el método "replace".

Código
  1. string str = "a b c d e f g";
  2. std::replace(str.begin(),str.end(), ' ', '\n');

En caso de que lo que quieras es transformar los espacios en saltos de línea.


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: ThunderCls en 17 Octubre 2015, 20:51 pm
Puedes usar la funcion "strtok" y no complicarte tanto la vida  :silbar:
http://www.cplusplus.com/reference/cstring/strtok/




Título: Re: Cómo convertir un string en una lista de strings
Publicado por: geeke en 18 Octubre 2015, 01:38 am
goto no deja de ser un ciclo (terriblemente aplicado)

A que te refieres con terriblemente aplicado?


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: engel lex en 18 Octubre 2015, 04:33 am
A que te refieres con terriblemente aplicado?

es un ciclo forzoso hecho con goto... el goto se debe usar solo cuando no haya más opción ya que está realmente desaconsejado su uso...


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: DarK_FirefoX en 18 Octubre 2015, 15:57 pm
A que te refieres con terriblemente aplicado?

La utilización de GOTO está considerada una mala práctica de programación, la cual lleva a un código "espagueti".

Deberías leerte este articulo escrito por Edjer Dijkstra para una publicación de la ACM en 1968

Inglés: http://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf (http://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf)
Español: http://www.findthatpdf.com/search-6879333-hPDF/download-documents-gotoesp.pdf.htm (http://www.findthatpdf.com/search-6879333-hPDF/download-documents-gotoesp.pdf.htm)

Salu2s


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: geeke en 18 Octubre 2015, 18:10 pm
La utilización de GOTO está considerada una mala práctica de programación, la cual lleva a un código "espagueti".

Deberías leerte este articulo escrito por Edjer Dijkstra para una publicación de la ACM en 1968

Siempre los anti-goto citan directamente el articulo de Edsger Dijkstra's para justificar su posición de rechazo hacia goto. Lastima que el articulo de Dijkstra's prácticamente no tiene nada que ver con la forma de que goto es utilizado estos días, por lo tanto lo que dice el articulo tiene poca o ninguna aplicabilidad en la escena de programación moderna.

Uno puede llegar a escribir código difícil de leer sin usar goto, por lo tanto no es la
característica del lenguaje la que conduce a un código ilegible e imposible de mantener ni tampoco la sintaxis mas bien son los malos programadores los que causan esto.

Evitar usar goto porque quiere evitar producir código ilegible no tiene sentido si su código goto es legible, entonces no hay nada malo en ello, el problema viene cuando se abusa de ellos. Por lo que todo esto me lleva a la conclusión de que todo este rechazo hacia goto es solo un modismo establecido no porque algunos programadores lo usen de manera ineficiente yo debería evitar usarlo.

Saludos!


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: ivancea96 en 18 Octubre 2015, 18:33 pm
Lo que haces con GOTO, lo puedes hacer con bucles y condiciones.
La finalidad de cada bucle y condición es más evidente a la vista que un GOTO (por no decir, que las etiquetas hay que buscarlas, cosas que con bucles y condiciones no pasa).
Además, en POO, el uso de GOTO es aun más terrible.

GOTO está muy bien en BATCH, y es necesario en ASM (JMP), pero en C++ no hay justificación lógica para utilizarlo.

Como dato, no leí el artículo de Dijkstra xD


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: Gunhack en 25 Octubre 2015, 21:43 pm
En c
Código
  1.  
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <ctype.h>
  5.  
  6. using namespace std;
  7.  
  8. int nPal(char *cadena); //Funcion que regresa el numero de palabras.
  9.  
  10. int main() {
  11.  
  12.  char cadena[] = {"Pablito clavo un clavito en la calva de un calvito"};
  13.  
  14.  int nPalabras = nPal(cadena); // Variable que almacena el numero total de palabras en la cadena.
  15.  char tokens[nPalabras][30]; //Variable que almacena cada palabra en un espacio del arreglo.
  16.  char *token = strtok(cadena, " ,.!?"); //Función que convierte una cadena a tokens.
  17.  
  18.  nPalabras = 0;
  19.  while(token != NULL) {
  20.  
  21.    strcpy(tokens[nPalabras++], token); //Se almacena cada token (palabra) en un espacio del arreglo.
  22.    token = strtok(NULL, " ,.-!?");
  23.  }
  24.  
  25.  for(int i = 0; i < nPalabras; i++){
  26.    printf("%s\n", tokens[i]);
  27.  }
  28. }
  29.  
  30. int nPal(char *cadena) {
  31.  
  32.  int n = 0;
  33.  
  34.  for(int i = 0; i < strlen(cadena); i++) {
  35.  
  36.    if(cadena[i] == ' ') {
  37.      n++;
  38.    }
  39.  }
  40.  
  41.  return n+1;
  42. }
  43.  
  44.  

En c++
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. int nPal(string cadena) {
  7.  
  8.  int n = 0;
  9.  
  10.  for(int i = 0; i < cadena.length(); i++) {
  11.  
  12.    if(cadena[i] == ' ' || cadena[i] == '/' || cadena[i] == '.' || cadena[i] == ',') {
  13.      n++;
  14.    }
  15.  }
  16.  
  17.  return n+1;
  18. }
  19.  
  20. int main ()
  21. {
  22.  string descomponer ("Pablito clavo un clavito en la calva de un calvito");
  23.  string token[nPal(descomponer)];
  24.  int ends=0;
  25.  int inicio=0;
  26.  int i=0;
  27.  
  28.  do{
  29.  inicio=descomponer.find_first_not_of(".,/ ",ends);
  30.  ends=descomponer.find_first_of(".,/ ",inicio);
  31.  token[i]=descomponer.substr(inicio,ends-inicio);
  32.  
  33.  cout << token[i]<<endl;
  34.  i++;
  35.  }while (ends!=-1);
  36. }
  37.  


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: Orubatosu en 26 Octubre 2015, 09:56 am
El "Goto" debería de estar prohibido, así de claro.

Yo recuerdo hace años, muchos años. Cuando los PC´s de escritorio eran algo que no se conocía e IBM no había sacado su XT (si, soy viejo ¿pasa algo?)

Los primeros ordenadores domésticos usaban BASIC (en su mayoría). Un lenguaje interpretado y que en ese momento hacía un uso abundante del Goto, e igualmente del GoSub.

Puede pensarse que un Gosub en realidad es una llamada a función, y que Goto no es tan malo. El problema no es la existencia de las herramientas, el problema es el uso que se termina dando a las mismas.

El que quiera asustarse, comentarle que algunas versiones del BASIC permitían incluso un "Goto variable". Donde la variable indica el número de línea al que debía de saltar la ejecución.

Imaginar algo como eso. ¿A que parece inofensivo?

Invito al que crea eso, a intentar depurar un programa de un par de miles de líneas que haga uso y abuso de esos goto, y veréis que gracioso es.

El cabo de una hora, no tenemos ni puñetera idea de por donde anda el flujo del programa.

Claro, es posible hacer una programación clara, documentada, estructurada, etc... incluso con la existencia de estas atrocidades. El problema es que siempre, siempre encontraremos a mas de un mendrugo que no lo hará, y si os toca intentar depurar o actualizar algo así, os cagaréis en todo lo santo y en la familia del que ha hecho esa gracia.


Título: Re: Cómo convertir un string en una lista de strings
Publicado por: DarK_FirefoX en 26 Octubre 2015, 17:33 pm
El "Goto" debería de estar prohibido, así de claro.

Yo recuerdo hace años, muchos años. Cuando los PC´s de escritorio eran algo que no se conocía e IBM no había sacado su XT (si, soy viejo ¿pasa algo?)

Los primeros ordenadores domésticos usaban BASIC (en su mayoría). Un lenguaje interpretado y que en ese momento hacía un uso abundante del Goto, e igualmente del GoSub.

Puede pensarse que un Gosub en realidad es una llamada a función, y que Goto no es tan malo. El problema no es la existencia de las herramientas, el problema es el uso que se termina dando a las mismas.

El que quiera asustarse, comentarle que algunas versiones del BASIC permitían incluso un "Goto variable". Donde la variable indica el número de línea al que debía de saltar la ejecución.

Imaginar algo como eso. ¿A que parece inofensivo?

Invito al que crea eso, a intentar depurar un programa de un par de miles de líneas que haga uso y abuso de esos goto, y veréis que gracioso es.

El cabo de una hora, no tenemos ni puñetera idea de por donde anda el flujo del programa.

Claro, es posible hacer una programación clara, documentada, estructurada, etc... incluso con la existencia de estas atrocidades. El problema es que siempre, siempre encontraremos a mas de un mendrugo que no lo hará, y si os toca intentar depurar o actualizar algo así, os cagaréis en todo lo santo y en la familia del que ha hecho esa gracia.


+1

Salu2s

PD: Cada cual es libre de hacer lo que quiera, solo cite el artículo porque creo necesario su lectura para entender porque no se DEBE usar.