elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Cadenas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cadenas  (Leído 3,889 veces)
monther

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Cadenas
« en: 3 Noviembre 2020, 06:39 am »

Hola , estoy realizando un programa en C que busque una palabra dentro de una cadena ,  lo que sucede es  que la segunda cadena no la esta leyendo , solo la primera que es ( cadena) ,me podrían ayudar porfavor
este es mi código
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    char cadena[500];
  6.    char palabra[50];
  7.    int x, w, z, val, op;
  8.  
  9.    printf("Ingrese la cadena: ");
  10.    gets(cadena);
  11.  
  12. do{
  13. fflush(stdin);
  14. x=0;
  15. w=0;
  16. val=0;
  17. printf("\nIngres la palabra a buscar: ");
  18.     gets(palabra);
  19.  
  20. while(cadena[x] != '\0'){
  21. x++;
  22. };
  23.  
  24. while(palabra[w] != '\0'){
  25. w++;
  26. };
  27.  
  28. for(int y=0; y<x; y++){
  29. z=0;
  30. while(palabra[z] != '\0'){
  31. if(palabra[z] == cadena[y+z]){
  32. val++;
  33. }
  34. z++;
  35. };
  36.  
  37. if(val==w){
  38. printf("\nPalabra encontrada en la posicion %d: ", y+1);
  39. y=x;
  40. } else{
  41. val=0;
  42. }
  43. }
  44.  
  45. if(val != w){
  46. printf("\nNo se encontro la palabra");
  47. }
  48.  
  49. printf("\n\nDesea buscar otra palabra(1=s/0=n): ");
  50.     scanf("%d", &op);
  51.  
  52. }while(op==1);
  53.  
  54.    return 0;
  55. }
  56.  
  57.  
  58.  
  59.  


« Última modificación: 4 Noviembre 2020, 00:47 am por monther » En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: Cadenas
« Respuesta #1 en: 3 Noviembre 2020, 09:27 am »

Modifica el post y añade lo que lleves echo o lo que intentaste. Así aprendes más que con un código de copiar y pegar.


En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Cadenas
« Respuesta #2 en: 3 Noviembre 2020, 15:56 pm »

http://www.cplusplus.com/reference/cstring/strstr/

Y como te han dicho: si quieres ayuda más concreta coloca tu código entre etiquetas de Código GeSHi.
En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Cadenas
« Respuesta #3 en: 4 Noviembre 2020, 01:00 am »

Modifica el post y añade lo que lleves echo o lo que intentaste. Así aprendes más que con un código de copiar y pegar.
hola gracias , si acabo de añadir mi código
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Cadenas
« Respuesta #4 en: 4 Noviembre 2020, 02:02 am »

A mí me funciona bien el código. Puede ser porque estés introduciendo cadenas demasiado largas o valores inválidos que hacen que queden restos en el buffer. De todas formas te comento algunas mejoras y seguro que si las implementas funciona correctamente:

  • Utiliza constantes para los tamaños.
Código
  1. const int SIZE_CADENA = 500;
  2. const int SIZE_PALABRA = 50;
  3.  
  4. int main(){
  5.  char cadena[SIZE_CADENA];
  6.  char palabra[SIZE_PALABRA];
  7.  //...
  8. }

  • Utiliza nombres de variables más descriptivos.
Código:
x -> longitudCadena
w -> longitudPalabra
z -> indiceBusqueda

  • La función gets() no debe usarse. Es más seguro utilizar fgets():
Código
  1. printf("Introduce una cadena: ");
  2. fgets(cadena, SIZE_CADENA, stdin); // guarda como mucho SIZE_CADENA-1 caracteres porque reserva el ultimo para '\0'

  • La función fflush() está implementada para limpiar el buffer de salida (stdout), no el de entrada (stdin). Tampoco se recomienda usarlo. Además cuando se usa gets()/fgets(), también se guarda el Enter ('\n') al final de la cadena.
Con el siguiente código puedes limpiar el buffer de entrada y al mismo tiempo eliminar el salto de línea al final de la cadena. Dos pájaros de un tiro (esto debe ir justo después del fgets() anterior):
* Para usar strlen() hay que importar <string.h>. Esta función devuelve la longitud de la cadena sin contar el '\0' (strlen("hola\0") = 4)
Código
  1. if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si el ultimo caracter es el Enter, lo eliminamos con '\0'
  2. else while(getchar() != '\n'); // sino, significa que la cadena no cabia entera y quedan restos en el buffer. Lo limpiamos.

Después de usar scanf() también quedará un '\n' en el buffer. Lo puedes limpiar de nuevo con el while():
Código
  1. scanf("%d", &repetir);
  2. while(getchar() != '\n'); // Limpia todo el buffer de entrada

Si sigue sin funcionarte comenta qué pruebas estás haciendo o porque sabes que no te está leyendo la segunda cadena.
En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Cadenas
« Respuesta #5 en: 4 Noviembre 2020, 04:34 am »

A mí me funciona bien el código. Puede ser porque estés introduciendo cadenas demasiado largas o valores inválidos que hacen que queden restos en el buffer. De todas formas te comento algunas mejoras y seguro que si las implementas funciona correctamente:

  • Utiliza constantes para los tamaños.
Código
  1. const int SIZE_CADENA = 500;
  2. const int SIZE_PALABRA = 50;
  3.  
  4. int main(){
  5.  char cadena[SIZE_CADENA];
  6.  char palabra[SIZE_PALABRA];
  7.  //...
  8. }

  • Utiliza nombres de variables más descriptivos.
Código:
x -> longitudCadena
w -> longitudPalabra
z -> indiceBusqueda

  • La función gets() no debe usarse. Es más seguro utilizar fgets():
Código
  1. printf("Introduce una cadena: ");
  2. fgets(cadena, SIZE_CADENA, stdin); // guarda como mucho SIZE_CADENA-1 caracteres porque reserva el ultimo para '\0'

  • La función fflush() está implementada para limpiar el buffer de salida (stdout), no el de entrada (stdin). Tampoco se recomienda usarlo. Además cuando se usa gets()/fgets(), también se guarda el Enter ('\n') al final de la cadena.
Con el siguiente código puedes limpiar el buffer de entrada y al mismo tiempo eliminar el salto de línea al final de la cadena. Dos pájaros de un tiro (esto debe ir justo después del fgets() anterior):
* Para usar strlen() hay que importar <string.h>. Esta función devuelve la longitud de la cadena sin contar el '\0' (strlen("hola\0") = 4)
Código
  1. if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si el ultimo caracter es el Enter, lo eliminamos con '\0'
  2. else while(getchar() != '\n'); // sino, significa que la cadena no cabia entera y quedan restos en el buffer. Lo limpiamos.

Después de usar scanf() también quedará un '\n' en el buffer. Lo puedes limpiar de nuevo con el while():
Código
  1. scanf("%d", &repetir);
  2. while(getchar() != '\n'); // Limpia todo el buffer de entrada

Si sigue sin funcionarte comenta qué pruebas estás haciendo o porque sabes que no te está leyendo la segunda cadena.
Muchas gracias , ya funciona cambie gets por fgets y tambienalgunas otras cosas que sugeriste, muchas gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Separación en cadenas
Programación Visual Basic
yeikos 4 1,821 Último mensaje 10 Septiembre 2005, 06:00 am
por EstoyBaneado
Cadenas...
Programación Visual Basic
programatrix 3 2,297 Último mensaje 30 Diciembre 2005, 22:13 pm
por programatrix
cadenas
Programación C/C++
johrdy 8 5,191 Último mensaje 14 Febrero 2012, 19:03 pm
por Valkyr
Cadenas c++
Programación C/C++
jaimeramirez10 3 2,305 Último mensaje 11 Junio 2013, 16:38 pm
por CCross
cadenas en c/c++
Programación C/C++
Beginner Web 4 2,259 Último mensaje 3 Julio 2019, 04:42 am
por codX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines