On Sat, 12 Jan 2002 11:17:55 -0800 (PST)
Jose Luis Alarcon <[EMAIL PROTECTED]> wrote:

>   Por favor, si hay por aqui alguien que
> conozca el C, le pido encarecidamente que
> eche un vistazo al programa que adjunto (es
> muy cortito) y averigue por que diablos
> falla la orden gets().

Antes que nada, tienes dos errores que no tienen realmente que ver con
eso: primero le das un char a scanf pero lees una cadena. Si el
usuario teclea mas que un car�cter, puede pasar de todo. Y el segundo
es que usas gets, que alegrar� mucho a los crackers, porque no
comprueba la longitud del buffer entregado, por lo que es possible
crear un buffer overflow y alterar el c�digo del programa en tiempo de
ejecuci�n. Tal como lo utilizas, el scanf tiene el mismo
problema. Adem�s hay algunos errores formales como que no declaras el
tipo de devoluci�n de main ni devuelves nada al sistema.

Acerca de tu problema: Primero: en realidad el prompt para salir del
bucle no deber�a ni salir, al menos que das un fflush (stdout), pero
como no est� garantido como se comporta el buffering, no es
predecible. Entonces: Si ejecutas el programa, vas a teclear no s�lo
`s' sino tambi�n un retorno de carro. El %s lee una cadena s�lo de
caracteres no blancos, y el retorno de carro cuenta como no
imprimible. As� que el retorno de carro se queda en el buffer. Despu�s
de la invitaci�n de teclear algo que escribir�as en el fichero, el
gets(), va a encontrarse con este retorno de carro y lo escribe en
datos.txt. Entonces recomienza el bucle y preguntas de nuevo si quiere
salir. Pero como no has tenido posibilidad de teclear los datos,
tampoco hubo un retorno de carro. Por eso, las dos preguntas te salen
en la misma l�nea.

Para hacerlo funcionar tendr�as que parar el buffering del tty que
est�s usando, lo que tiene unos par�metros bastante esot�ricos. Ser�a
m�s f�cil que uses la librer�a curses, que hace justamente eso y m�s.

Si esto es un ejemplo de un libro, cambia de libro.

-- 
christoph Simon
[EMAIL PROTECTED]
---
^X^C
q
quit
:q
^C
end
x
exit
ZZ
^D
?
help
.

Responder a