[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: OT gets() en Lenguaje C.



On Sat, 12 Jan 2002 11:17:55 -0800 (PST)
Jose Luis Alarcon <jlalarcon@linuxpower.cc> 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
ciccio@kiosknet.com.br
---
^X^C
q
quit
:q
^C
end
x
exit
ZZ
^D
?
help
.



Reply to: