| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
luksrod
Registrado: 03 Oct 2012 Mensajes: 5
| Publicado: 03/10/2012 9:46 am | | | Título: Ayuda con sentencia while se saltea un scanf y queda en loop |
| Estoy haciendo un ahorcado con un menú adentro de un while, el problema viene cuando estoy en el menu y en vez de ingresar un numero, ingreso algun carácter, el programa queda en loop como si no estuviera la linea scanf("%d",&menu); lo mismo sucede cuando ingreso el numero 1 me pide que ingrese la palabra o la frase, si pongo una palabra (sin espacios dentro del arary) no hay problema, el problema llega cuando pongo algun espacio dentro del array, sucede lo mismo, queda en loop como si no eexistiera la misma linea, alguien que me ayude, el trabajo es para el miércoles 10/10 (el que viene)
| Código: | #include <stdio.h> #include <stdlib.h> #include <conio.h>
main() { int menu; char palabra[257]; menu=99; system("color 8F"); while(menu!=0){ printf(" Ahorcado\n\nIngrese un n\243mero seg\243n la opci\242n deseada.\n\n 1-Ingresar frase o palabra a adivnar\n 2-Adivinar Palabra\n 3-Ver la Ayuda\n 4-Cr\202ditos\n 0-Salir\n By Lucas Rodr\241guez \251\n"); scanf("%d",&menu);
system("cls"); if(menu==1){ printf("Ingrese la frase o palabra a adivinar\n"); scanf("%s,&palabra"); system("cls"); }
} } |
El compilador que uso es DEV C++ (el recomendado por el profesor) sobre Windows 7
Desde ya muchas gracias PD no lo pongo en el foro Trabajos de Clase porque no pretendo que me lo hagan. |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 7000 Ubicación: Mexico
| Publicado: 04/10/2012 7:48 am | | | Título: Re: Ayuda con sentencia while se saltea un scanf y queda en |
| | luksrod escribió: | | Estoy haciendo un ahorcado con un menú adentro de un while, el problema viene cuando estoy en el menu y en vez de ingresar un numero, ingreso algun carácter, el programa queda en loop como si no estuviera la linea scanf("%d",&menu); |
El problema aquí se debe a que la función "scanf" solo consume los caracteres que sean validos para la conversión indicada. Si tu introduces 'Z' al tratar de leer un entero con esa función el carácter se queda en el bufer de la entrada estándar "bloqueando" la lectura de datos.
Una solución es leer por linea utilizando "fgets" y a continuación extraer el valor deseado de ella con "sscanf" (prototipo de ambas en <stdio.h>).
| luksrod escribió: | | lo mismo sucede cuando ingreso el numero 1 me pide que ingrese la palabra o la frase, si pongo una palabra (sin espacios dentro del arary) no hay problema, el problema llega cuando pongo algun espacio dentro del array, sucede lo mismo |
Eso se debe a que el especificador "%s" indica a la función que lea una palabra, si lo que deseas leer es una linea de texto debes utilizar "fgets" (con un detalle: esa función almacena el avance de linea '\n' como parte de la cadena).
Tu programa con las correcciones:
| Código: | #include <stdio.h> #include <conio.h>
#define LONG_LINEA 256
int main(void) { char linea[LONG_LINEA]; char palabra[LONG_LINEA]; int menu; int i; do { puts( "Ahorcado\n" "1 Ingresar frase o palabra a adivinar\n" "2 Adivinar Palabra\n" "3 Ver la Ayuda\n" "4 Creditos\n" "0 Salir" ); do { puts("Indica la opcion deseada:"); fgets(linea, LONG_LINEA, stdin); }while (sscanf(linea, "%d", &menu) != 1); if (menu == 1) { printf ("Ingrese la frase o palabra a adivinar\n"); fgets(palabra, LONG_LINEA, stdin); /* Buscamos y eliminamos (si existe) el avance de linea */ for (i = 0; palabra[i] != '\0'; i++) ; if (i > 0 && palabra[i - 1] == '\n') palabra[i - 1] = '\0'; system ("cls"); } }while (menu != 0); return 0; } |
Por ultimo deberías evitar el uso de la biblioteca "conio" de Borland.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
leosansan
Registrado: 04 Oct 2012 Mensajes: 9
| Publicado: 04/10/2012 8:41 am | | | Título: Re: Ayuda con sentencia while se saltea un scanf y queda en |
| Sin loops ni problemas de espacios en blanco, como ya te adelanto rir3760. Aunque no soy muy partidario, hay que reconocer que la función fflush hace el trabajo que se espera de ella en momentos como este:
| Código: | #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <conio.h>
main() { int menu; char palabra[257]; menu=99; system("color 8F"); while(menu!=0){ printf(" Ahorcado\n\nIngrese un n\243mero seg\243n la opci\242n deseada.\n\n 1-Ingresar frase o palabra a adivnar\n 2-Adivinar Palabra\n 3-Ver la Ayuda\n 4-Cr\202ditos\n 0-Salir\n By Lucas Rodr\241guez \251\n"); scanf("%d",&menu); fflush (stdin); system("cls"); if(menu==1){ printf("Ingrese la frase o palabra a adivinar\n"); scanf("%s,&palabra"); system("cls"); }
} }
|
|
|
| Volver arriba | |
 |
|
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 1273
| Publicado: 04/10/2012 8:56 am | | | Título: |
| fflush no tiene porque funcionar con stdin ya que solo funciona con flujos de salida. Si funciona es por una mera extensión del lenguaje C. No todo compilador o SO tiene porque soportarlo.
leosansan, eres leosan? Sí es así, ¿que pasó con tu otra cuenta?
Un saludo! |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 7000 Ubicación: Mexico
| Publicado: 04/10/2012 8:58 am | | | Título: Re: Ayuda con sentencia while se saltea un scanf y queda en |
| | leosansan escribió: | | Sin loops ni problemas de espacios en blanco, como ya te adelanto rir3760. Aunque no soy muy partidario, hay que reconocer que la función fflush hace el trabajo que se espera de ella en momentos como este |
El problema con la llamada "fflush(stdin)" es, como ya te comente en otro tema, su resultado (comportamiento no definido). Mas todavía cuando se puede evitar el problema utilizando solo la biblioteca estándar de C.
Y para la lectura de la frase lo mas sencillo es mediante "fgets".
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
leosansan
Registrado: 04 Oct 2012 Mensajes: 9
| Publicado: 04/10/2012 9:01 am | | | Título: |
| | Cita: | | leosansan, eres leosan? Sí es así, ¿que pasó con tu otra cuenta? |
NO, soy leosansan. Me muevo más en el foro el hacker.net, pero como lo ví algo parado decidí pasar por aquí. Espero no molestar. Un saludo! |
|
| Volver arriba | |
 |
|
rir3760

Registrado: 01 Oct 2004 Mensajes: 7000 Ubicación: Mexico
| Publicado: 04/10/2012 9:40 am | | | Título: |
| | leosansan escribió: | | Pantalàimon_ escribió: | | leosansan, eres leosan? Sí es así, ¿que pasó con tu otra cuenta? |
NO, soy leosansan. Me muevo más en el foro el hacker.net, pero como lo ví algo parado decidí pasar por aquí. Espero no molestar. |
Supongo solo se trata de una broma. Desde mi perspectiva leosan y leosansan son el mismo usuario, ¿Correcto?
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 1273
| |
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 7000 Ubicación: Mexico
| Publicado: 04/10/2012 10:11 am | | | Título: |
| Y ni que decir de la IP address (los moderadores podemos listarlas por usuario/dominio). 
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
|
leosansan
Registrado: 04 Oct 2012 Mensajes: 9
| Publicado: 04/10/2012 10:33 am | | | Título: |
| | rir3760 escribió: | | Y ni que decir de la IP address (los moderadores podemos listarlas por usuario/dominio). |
Lamento decepcionarles, mi padre se ha mudado a la capital, y hasta dentro de una semana o más no tendrá Internet, como comprobará el resabido y lo digo por los "encuentros" en otro foro- rir3760. Esperen ese tiempo y "verán" su dirección IP. Mientras tanto tendrán que resignarse con su hijo, que se queda en la casa de campo y hereda su ordenador e "IP". Por cierto, acabo de hablar con él mientras posteaba esto y me manda recuerdos para todos. El muy capullo es así. Un saludo |
|
| Volver arriba | |
 |
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 1273
| Publicado: 04/10/2012 10:52 am | | | Título: |
| De todas maneras me parece curioso que padre e hijo tengan el mismo estilo al sangrar código y cometan los mismos errores recurrentes. Esto me da a suponer que estáis aprendiendo a la vez y el uno del otro. Más me sorprende que posteéis el mismo código en foros distintos pero, vaya, todo es posible.
Eso si:
| leosansan escribió: | | El muy capullo es así. |
Estaría bien respetar las reglas de los foros y no descalificar a otro usuario de éste:
| Cita: | | - Quedan prohibidos los insultos y las descalificaciones. Los mensajes de este tipo serán borrados. |
Siempre se pueden guardar para la vida íntima. 
Un saludo y bienvenido. |
|
| Volver arriba | |
 |
|
|