Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: samur88 en 17 Mayo 2011, 00:47 am



Título: El dichoso error de fgets.
Publicado por: samur88 en 17 Mayo 2011, 00:47 am
Disculpad las molestias pero tengo el siguiente error:
He leído en este foro las cosas que no se deben hacer al programar en C, una de ellas era utilizar funciones como scanf que no tienen limite de caracteres insertados, para ello el tutorial proponer fgets, otras de las cosas sobre las que habla el manual es sobre el uso de fflush(stdin) que aunque la gente lo use para una cosa no sirve para eso, ya que este limpia el buffer de salida y no el de entrada.

El caso es que al usar fgets no me deja introducir los datos, ya que salta directamente a la siguiente linea, al poner fflush(studin) se soluciona pero eso no me vale, yo quiero saber por que es esto y una forma segura de solucionarlo y no con fflush(studin) y sus comportamientos caóticos.

El fragmento de código es este:

En main defino estas dos variables:                       
Código
  1. char tempnum;
  2. int dni = 0;
                       
Código
  1. case 'c': case 'C':
  2.                        printf("Introduzca el dni del medico a buscar: ");
  3.                        fgets(tempnum,11,stdin);
  4.                        if (tempnum[strlen(tempnum)-1] == '\n')
  5.                           tempnum[strlen(tempnum)-1] = '\0';
  6.                        sscanf(tempnum,"%d",&dni);
  7.                        search_listM(primero,dni);
  8.                        printf("Pulse una tecla para continuar.");
  9.                        getchar();
  10.                        break;

Un saludo.


Título: Re: El dichoso error de fgets.
Publicado por: Acermax en 17 Mayo 2011, 01:06 am
Pues lo único que puedes hacer es leer todo el buffer, por ejemplo haciendo esto.

Código:
while(getchar() != '\n');
setbuf(stdin, NULL);

Esto está sacado de este mismo foro.


Título: Re: El dichoso error de fgets.
Publicado por: samur88 en 17 Mayo 2011, 01:18 am
Muchas gracías, encontre ese mismo codigo aquí al final jej pero tengo un problema grandisimo para entenderlo.

Tal como entiendo esto:
Código
  1. while(getchar()!='\n');

lo que haría sería avanzar posiciones en stdin hasta encontrar un salto de linea, en ese momento studin no contiene el salto de linea, pero no entiendo el funcionamiento de esto, si supuestamente yo no pulso ninguna tecla, ¿que hace que getchar() avance posiciones en stdin?

¿La función setbuf(stdin, NULL) que haría?

Un saludo y muchas gracias de nuevo.


Título: Re: El dichoso error de fgets.
Publicado por: Lx en 17 Mayo 2011, 06:43 am
 -- Mensaje Borrado --


Título: Re: El dichoso error de fgets.
Publicado por: samur88 en 17 Mayo 2011, 12:30 pm
Muchas gracias por la explicación, aunque no entiendo aún muy bien lo del bucle, ¿lo que haría sería que la próxima vez que se ingresen caracteres por el teclado, espere a que el usuario pulse enter?
Pero de que forma getch hace eso, ya que por ejemplo en mi código hay después del bucle un printf y no directamente la función fgets.

Un saludo.


Título: Re: El dichoso error de fgets.
Publicado por: Lx en 18 Mayo 2011, 04:01 am
 -- Mensaje Borrado --


Título: Re: El dichoso error de fgets.
Publicado por: samur88 en 18 Mayo 2011, 20:51 pm
Muchas gracias por la explicación, ya creo que entendí, como hay algo en stdin getchar no esperara que yo pulse ninguna tecla pues ya hay algo en el, de esta forma avanzara posiciones hasta llegar al salto de linea, por lo tanto stdin no tendra ningún salto después de esto.
Así fgets no dará problemas.

Un saludo y gracias de nuevo.