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():
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.