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;
}
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.
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.
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
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.
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