Cadenas

Iniciado por monther, 3 Noviembre 2020, 06:39 AM

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

monther

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

#include <stdio.h>

int main()
{
   char cadena[500];
   char palabra[50];
   int x, w, z, val, op;
   
   printf("Ingrese la cadena: ");
   gets(cadena);

do{
fflush(stdin);
x=0;
w=0;
val=0;
printf("\nIngres la palabra a buscar: ");
    gets(palabra);

while(cadena[x] != '\0'){
x++;
};

while(palabra[w] != '\0'){
w++;
};

for(int y=0; y<x; y++){
z=0;
while(palabra[z] != '\0'){
if(palabra[z] == cadena[y+z]){
val++;
}
z++;
};

if(val==w){
printf("\nPalabra encontrada en la posicion %d: ", y+1);
y=x;
} else{
val=0;
}
}

if(val != w){
printf("\nNo se encontro la palabra");
}

printf("\n\nDesea buscar otra palabra(1=s/0=n): ");
    scanf("%d", &op);

}while(op==1);

   return 0;
}





@XSStringManolo

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.

K-YreX

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.
Código (cpp) [Seleccionar]

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

monther

Cita de: @XSStringManolo 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.
hola gracias , si acabo de añadir mi código

K-YreX

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.

    const int SIZE_CADENA = 500;
    const int SIZE_PALABRA = 50;

    int main(){
      char cadena[SIZE_CADENA];
      char palabra[SIZE_PALABRA];
      //...
    }


  • Utiliza nombres de variables más descriptivos.

    x -> longitudCadena
    w -> longitudPalabra
    z -> indiceBusqueda


  • La función gets() no debe usarse. Es más seguro utilizar fgets():

    printf("Introduce una cadena: ");
    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)

    if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si el ultimo caracter es el Enter, lo eliminamos con '\0'
    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():

    scanf("%d", &repetir);
    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.
Código (cpp) [Seleccionar]

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

monther

Cita de: K-YreX 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.

    const int SIZE_CADENA = 500;
    const int SIZE_PALABRA = 50;

    int main(){
      char cadena[SIZE_CADENA];
      char palabra[SIZE_PALABRA];
      //...
    }


  • Utiliza nombres de variables más descriptivos.

    x -> longitudCadena
    w -> longitudPalabra
    z -> indiceBusqueda


  • La función gets() no debe usarse. Es más seguro utilizar fgets():

    printf("Introduce una cadena: ");
    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)

    if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si el ultimo caracter es el Enter, lo eliminamos con '\0'
    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():

    scanf("%d", &repetir);
    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