Me estoy iniciando en el lenguaje C. Estoy usando eclipse (juno) como mi IDE e instalado CDT plugin. También he descomprimido mingw64 (compilador GCC). Escribí un programa muy simple para ver si funciona. Este es mi código:
#include <stdio.h>
int main()
{
int age;
printf("Hello, please enter your age:\n");
scanf("%d", &age);
printf("Your age is %d", age);
return 0;
}
El problema es que el buffer de salida se llena con el valor de la cadena del primer printf
pero no lo vierte a la consola. Tengo que introducir un número, y sólo entonces el buffer vierte todos los datos a la consola, de modo que veo en la consola algo como esto
1
Hello, please enter your age:
Your age is 1
en vez de lo esperado que es
Hello, please enter your age:
1
Your age is 1
Ahora, he encontrado que puedo usar fflush(stdout)
después del primer printf
pero no creo que esta solución sea elegante e incluso necesaria. ¿Alguna idea de cómo puedo solucionar esto?
EDIT - como estoy aprendiendo esto en mi universidad, no puedo usar nada que no haya aprendido en el curso, así que sólo puedo usar printf
y scanf
.
NUEVA EDICIÓN - Creo que he encontrado una explicación para esto. Como he dicho, estoy dando salida a la vista de consola dentro de Eclipse. Lo extraño es que si compilo y ejecuto el programa desde la línea de comandos de Windows, obtengo el resultado deseado. Por lo tanto, creo que en realidad eclipse está escribiendo la salida en un archivo y presentándolo en la ventana de la consola. ¿Cómo puedo forzar a eclipse a abrir una ventana de línea de comandos real en mis configuraciones de ejecución?
La salida se tampona.
stdout es line-buffered por defecto, lo que significa que '\n' se supone que vacía el buffer. ¿Por qué no sucede en tu caso? No lo sé. Necesito más información sobre tu aplicación/entorno.
Sin embargo, puedes controlar el buffering con setvbuf():
setvbuf(stdout, NULL, _IOLBF, 0);
Esto forzará a stdout a tener un búfer de línea.
setvbuf(stdout, NULL, _IONBF, 0);
Esto forzará a stdout a no tener búfer, por lo que no necesitará usar fflush(). Tenga en cuenta que afectará seriamente al rendimiento de la aplicación si tiene muchas impresiones.