/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda con sentencia while se saltea un scanf y queda en loop

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
luksrod



Registrado: 03 Oct 2012
Mensajes: 5

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 04/10/2012 9:51 am
Título:

rir3760 escribió:

Supongo solo se trata de una broma.

Eso supongo. Dicen que se pilla antes a un bromista que a un cojo¿no? Laughing
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7000
Ubicación: Mexico

MensajePublicado: 04/10/2012 10:11 am
Título:

Y ni que decir de la IP address (los moderadores podemos listarlas por usuario/dominio). Rolling Eyes

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

MensajePublicado: 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

MensajePublicado: 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. Smile

Un saludo y bienvenido.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com