elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  El dichoso error de fgets.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: El dichoso error de fgets.  (Leído 6,761 veces)
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
El dichoso error de fgets.
« 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.


En línea

Acermax

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: El dichoso error de fgets.
« Respuesta #1 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.


En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: El dichoso error de fgets.
« Respuesta #2 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.
En línea

Lx

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: El dichoso error de fgets.
« Respuesta #3 en: 17 Mayo 2011, 06:43 am »

 -- Mensaje Borrado --
« Última modificación: 22 Mayo 2011, 03:21 am por Lx » En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: El dichoso error de fgets.
« Respuesta #4 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.
En línea

Lx

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: El dichoso error de fgets.
« Respuesta #5 en: 18 Mayo 2011, 04:01 am »

 -- Mensaje Borrado --
« Última modificación: 22 Mayo 2011, 03:21 am por Lx » En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: El dichoso error de fgets.
« Respuesta #6 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con fgets
Programación C/C++
P.AGCD 3 3,889 Último mensaje 14 Julio 2011, 20:41 pm
por kiriost
Dichoso Diccionario Beini 1.2.1
Hacking Wireless
akira58 3 7,099 Último mensaje 22 Mayo 2012, 16:31 pm
por akira58
[?] Error fgets (Solucionado) « 1 2 »
Programación C/C++
MeCraniDOS 19 10,281 Último mensaje 21 Enero 2014, 22:31 pm
por xiruko
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines