Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mapers en 10 Julio 2010, 07:47 am



Título: romper una cadena
Publicado por: mapers en 10 Julio 2010, 07:47 am
holas gente quisiera que me den una idea de como poder romper una cadena y hacer comparaciones ....
tengo esto --->HOLA MUNDOLA DE PROGRAMOLA
quiero compara ola con toda la frase y que me den el numero de veces que se repite la palabra  con cada una de las palabras de la frase ....
se puede hacer con strcmpy pero es muy tedioso pork tendria que saltar los espacios otra idea ..gracias 


Título: Re: romper una cadena
Publicado por: @synthesize en 10 Julio 2010, 07:52 am
Prueba a revisar string.h

http://opengroup.org/onlinepubs/007908799/xsh/string.h.html (http://opengroup.org/onlinepubs/007908799/xsh/string.h.html)


Título: Re: romper una cadena
Publicado por: mapers en 10 Julio 2010, 08:29 am
ya lo intente hacer de esta manera ´pero no me da a ver en que me equivocado

Código
  1.  
  2. #include <iostream>
  3. using std::cout;
  4. using std::endl;
  5. #include <cstring>
  6. int main()
  7. {
  8.  char frase[]="HOLA MUNDOLA DE PROGRAMOLA";
  9.  char *parte;
  10.  cout << "LA FRASE ANTES: " << frase << endl;
  11.  parte= strtok(frase," ");
  12.    {
  13.      cout << parte<< endl;
  14.      parte = strtok(NULL, " ");
  15.      if((strstr(parte,"OLA"))==1)
  16.      {
  17.      cout<<"si"<<endl;
  18.      }
  19.    }
  20.  
  21.    system("PAUSE");
  22.    return EXIT_SUCCESS;
  23. }
  24.  


Título: Re: romper una cadena
Publicado por: Ariath en 10 Julio 2010, 11:56 am
Cita de: mapers
Código
  1. parte= strtok(frase," ");
  2.    {
  3.      cout << parte<< endl;
  4.      parte = strtok(NULL, " ");
  5.      if((strstr(parte,"OLA"))==1)
  6.      {
  7.      cout<<"si"<<endl;
  8.      }
  9.    }
  10.  

¿Las llaves de la segunda y última línea a qué corresponden?

No veo ningún while, if, for, etc ... por ahi .

Por otra parte, podrías poner simplemente un using namespace std, en vez de los 2 using que has colocado.

Aquí te dejo un ejemplo de la web de cplusplus, no aparece la comparación, pero bastaría con ubicarla en el sitio adecuado:

Cita de: cplusplus
Código
  1. /* strtok example */
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main ()
  6. {
  7.  char str[] ="- This, a sample string.";
  8.  char * pch;
  9.  printf ("Splitting string \"%s\" into tokens:\n",str);
  10.  pch = strtok (str," ,.-");
  11.  while (pch != NULL)
  12.  {
  13.    printf ("%s\n",pch);
  14.    pch = strtok (NULL, " ,.-");
  15.  
  16.    //Comentario de Ariath: Aquí podrías poner la comparación entre pch y otra cosa.
  17.  }
  18.  return 0;
  19. }
  20.  

Salu2


Título: Re: romper una cadena
Publicado por: mapers en 10 Julio 2010, 20:43 pm
Código
  1.  
  2. #include <iostream>
  3. using std::cout;
  4. using std::endl;
  5. #include <cstring>
  6. int main()
  7. {
  8.  char frase[]="HOLA MUNDOLA DE PROGRAMOLA";
  9.  char *parte;
  10.  cout << "LA FRASE ANTES: " << frase << endl;
  11.  parte= strtok(frase," ");
  12.  while (parte != NULL)
  13.    {
  14.  
  15.      if((strstr(parte,"OLA"))!=0)
  16.      cout<<"si"<<endl;
  17.      cout << parte<< endl;
  18.      parte = strtok(NULL,"  ");
  19.  
  20.    }
  21.  
  22.    system("PAUSE");
  23.    return EXIT_SUCCESS;
  24. }
  25.  

a ver asi --------------->


Título: Re: romper una cadena
Publicado por: Ariath en 10 Julio 2010, 20:59 pm
Esto... ¿Qué errores te marca?

La parte de la comparación yo la haría así:

Código
  1. if(strcmp(parte, "OLA") == 0)
  2. cout << "si" << endl;
  3.  

Usando strstr buscas la posición de la cadena 'parte' en la que se encuentra la cadena "OLA".

Aunque en el caso en que la cadena existente en 'parte' fuese "OLA" funcionaría, creo que es mejor usar strcmp, pues lo que hace es una comparación entre la cadena 1 y la cadena 2.

Si son iguales, devuelve 0, y sino, es que hay diferencias.

También creo que podrías simplemente hacer una comparación con ==, al estilo de:
Código
  1. if(parte == "OLA")

SAlu2


Título: Re: romper una cadena
Publicado por: leogtz en 10 Julio 2010, 21:31 pm
¿Te refieres a buscar si "ola" está contenida en cada una de las palabras de la frase?

Si es así el código con unos ajustes funciona:

Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4. #include <cstring>
  5. int main(void)
  6. {
  7.  char frase[] = "HOLA MUNDOLA DE PROGRAMOLA";
  8.  char *parte;
  9.  unsigned int i = 0;
  10.  cout << "LA FRASE ANTES: " << frase << endl;
  11.  parte= strtok(frase," ");
  12.  while (parte != NULL)
  13.    {
  14.  
  15.      if((strstr(parte,"OLA")) != 0)
  16.      {
  17.          cout << parte << "<-- SI"<<endl;
  18.          i++;
  19.      }
  20.      parte = strtok(NULL,"  ");
  21.    }
  22.    cout << "\n\"ola\" contenida " << i << " veces en la frase";
  23.    std::cin.get();
  24.    return EXIT_SUCCESS;
  25. }
  26.  

Salida:
Código:
LA FRASE ANTES: HOLA MUNDOLA DE PROGRAMOLA
HOLA<-- SI
MUNDOLA<-- SI
PROGRAMOLA<-- SI

"ola" contenida 3 veces en la fras

No le veo el problema.