Я начинаю на языке C. Я использую uplyce (juno) в качестве своей IDE и установил плагин CDT. Я также распаковал mingw64 (GCC Compiler). Я написал очень простую программу, чтобы увидеть, работает ли она. Это мой код:
#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;
}
Проблема в том, что выходной буфер заполнен строковым значением первого printf
, но не выводит его на консоль. Я должен ввести число, и только тогда буфер выливает все данные на консоль, поэтому я вижу консоль примерно так:
1
Hello, please enter your age:
Your age is 1
вместо того, что ожидается, что есть:
Hello, please enter your age:
1
Your age is 1
Теперь я обнаружил, что могу использовать «fflush (stdout)» после первого «printf», но я не думаю, что это решение элегантно и даже необходимо. Любые идеи о том, как я могу преодолеть это?
EDIT - потому что я учусь этому в своем университете, я не могу использовать ничего, что не было изучено в курсе, поэтому я могу только использовать printf
и scanf
НОВОЕ РЕДАКЦИЯ - Думаю, я нашел объяснение этому. Как я уже сказал, я выхожу на консоль внутри Eclipse. Странно то, что если я скомпилирую и запускаю программу из командной строки Windows, я получу желаемый результат. Поэтому я думаю, что затмение на самом деле записывает выходные данные в файл и представляет их в окне консоли. Как я могу заставить затмение открыть реальное окно командной строки в моих конфигурациях запуска?
Выход буферизируется.
stdout по умолчанию подвергается буферизации строк, что означает, что «\ n» должен промывать буфер. Почему это не происходит в вашем случае? Не знаю. Нужна дополнительная информация о вашем приложении / окружающей среде.
Тем не менее, вы можете контролировать буферизацию с помощью setvbuf ():
setvbuf(stdout, NULL, _IOLBF, 0);
Это заставит stdout быть буферизованным.
setvbuf(stdout, NULL, _IONBF, 0);
Это заставит stdout быть небуферным, поэтому вам не нужно будет использовать fflush (). Обратите внимание, что это сильно повлияет на производительность приложения, если у вас много отпечатков.
Видимо, это известная ошибка Eclipse. Эта ошибка устраняется с разрешением WONT-FIX. Я понятия не имею, почему, хотя. вот ссылка: [Затмение C C Console Bug][1].
[1]: https://bugs.eclipse.org/bugs/show_bug.cgi?id = 173732
Попробуйте установить это перед печатью:
setvbuf (stdout, NULL, _IONBF, 0);
Вы можете попробовать написать stderr, а не stdout.
fprintf(stderr, "Hello, please enter your age\n");
Вы также должны взглянуть на это соответствующую ветку.
Как уже отмечали другие, выходные данные могут быть буферизованы в вашей программе до того, как консоль или оболочка смогут это увидеть.
В Unix-подобных системах, включая mac, stdout
по умолчанию имеет линейную буферизацию. Это означает, что ваша программа очищает свой буфер stdout
, как только видит новую строку.
Однако на окнах новые линии больше не являются особенными, и используется полная буферизация. Windows вообще не поддерживает буферизацию строк; см. страница msdn на setvbuf.
Таким образом, на окнах хороший подход - полностью отключить буферизацию stdout
, как это:
setvbuf (stdout, NULL, _IONBF, 0);
Добавьте переменную среды c: \ gygwin \ bin
в PATH
либо в качестве переменной системной среды, либо в вашем проекте затмения (properties-> run / debug-> edit)