• Domingo 15 de Diciembre de 2024, 16:41

Autor Tema:  [SOLUCIONADO] problema con getchar()  (Leído 1931 veces)

juanigato

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
[SOLUCIONADO] problema con getchar()
« en: Sábado 11 de Abril de 2009, 05:12 »
0
Si utilizo un scanf de un entero y a continuacion un getchar(), este último no funciona. ¿Por qué?

int main()
{
   char continue_o_exit;
   int number;

   printf ("Determine un valor a number: ");
   scanf ("%d", &number);
   printf ("Number is %d", number);
   

   printf ("nnSelecciona continue (c) or exit (e): ");
   continue_o_exit = getchar();
   
   
   if (continue_o_exit == 'c')
      printf ("continue");
   else
      printf ("exit");


   return 0;
}


Se que repitiendo
continue_o_exit = getchar();
solucione el problema, pero me gustaría saber por qué no funciona de una para aprender.
Gracias por su tiempo y ayuda.
« última modificación: Lunes 13 de Abril de 2009, 01:32 por juanigato »

robbie110487

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: problema con getchar()
« Respuesta #1 en: Sábado 11 de Abril de 2009, 07:33 »
0
Hola, la explicación es simple:
La razón es que el sistema operativo almacena en un buffer las teclas pulsadas, scanf() toma el primer argumento para saber qué tipo de datos son, por lo tanto el retorno de carro(enter) no lo toma. Después cuando llamas a getchar(), ésta recibe el siguiente caracter que hay en el buffer del teclado, y como scanf ha dejado el retorno de carro pues se queda con él. En caso contrario espera la pulsación.

La solución es limpiar el buffer antes de utilizar getchar(), una función como está solucionaria el problema:
Código: C
  1. void limpiarBuffer()
  2. {
  3.     int ch;
  4.     while((ch = fgetc(stdin))!= EOF && ch != 'n' ){}
  5. }
  6.  
Y la mandas llamar cada vez que necesites limpiar el buffer.

Saludos

juanigato

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: [SOLUCIONADO] problema con getchar()
« Respuesta #2 en: Lunes 13 de Abril de 2009, 01:33 »
0
Gracias robbie, muy buena y útil respuesta!