Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/07/2010, 18:24
scmbg
 
Fecha de Ingreso: junio-2010
Mensajes: 22
Antigüedad: 14 años, 4 meses
Puntos: 1
Respuesta: Problema usando el gets con estructuras y ciclos

El problema es con los "buffers" que se llenan al momento de leer informacion.

scanf lee informacion formateada de un buffer (para eso del %d y de mas) que se va llenando del stdin, cada que se llama a scanf, hace un flush (vaciado) al buffer para evitar que contenga información que no corresponda.

gets lee un string desde stdin, pero como no es formateado, lee lo que encuentra, no lo carga a un buffer y problablemente se encuentra con informacion que dejo el scanf, tal vez un null al comienzo, para anular el buffer. Y la segunda vez que lo llamas a gets ya no lo tiene (el anterior lo consumio) y espera a que introduscas los datos.

Lo que haga scanf depende del runtime, el SO, la libreria, etc, ademas de mas factores, curso de SO necesario, jejeje.

El problema es que las funciones com scanf y gets se bloquean, esperan a que escribas, hasta que encuentran el null, \n o el eof, pero si esta alguno de estos en lo que acaba de leer de stdin lo carga y por eso no se bloquea. Similar a lo que pasa cuando introduces un tipo de dato no incorrecto (numero en lugar de letra).

En realidad es algo complicado de tratar, el mismo manual de fscan es algo raro

Cita:
The scanf() function reads input from the standard input stream stdin, fscanf() reads input from the stream pointer stream, and scanf() reads its input from the character string pointed to by str.
Lo que te recomiendo es tratar de tener los buffers en limpio, con "flush"es, o usar funciones sin buffer, o usar funciones de la misma familia, asi aseguras el mismo trato de los datos.

Y como en el otro tema, gcc chilla si usas gets.

Cita:
test.cpp:(.text+0xa6): warning: the `gets' function is dangerous and should not be used.