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 .