printf не печатать на консоли
Я начинаю работу на языке C. Я использую eclipse (juno) в качестве IDE и установленного плагина CDT. Я также распаковал Mingw64 (компилятор GCC). Я написал очень простую программу, чтобы проверить, работает ли она. Вот мой код:
#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
но я не думаю, что это решение элегантно и даже нужно. Есть идеи, как мне это преодолеть?
редактировать - поскольку я изучаю это в своем университете, я не могу использовать ничего, что не было изучено в курсе, поэтому я могу только использовать printf
и scanf
НОВОЕ РЕДАКТИРОВАНИЕ - я думаю, что нашел объяснение этому. Как я уже сказал, я выхожу на консольный вид внутри Eclipse. Странно то, что если я компилирую и запускаю программу из командной строки Windows, я получаю желаемый результат. Поэтому я думаю, что eclipse фактически записывает вывод в файл и представляет его в окне консоли. Как заставить eclipse открыть реальное окно командной строки в моих конфигурациях запуска?
7 ответов
по-видимому, это известная ошибка Eclipse. Эта ошибка разрешена с разрешением WONT-FIX. Я понятия не имею, почему. вот ссылка: Ошибка Консоли Eclipse C.
вывод буферизуется.
stdout по умолчанию буферизуется линией, что означает, что "\n " должен очистить буфер. Почему это не происходит в вашем случае? Не знаю. Нужна дополнительная информация о приложении/среде.
однако вы можете управлять буферизацией с помощью setvbuf ():
setvbuf(stdout, NULL, _IOLBF, 0);
это заставит stdout быть буферизованным по линии.
setvbuf(stdout, NULL, _IONBF, 0);
это заставит stdout быть unbuffered, поэтому вам не нужно будет использовать fflush (). Обратите внимание, что это будет сильно влияет на производительность приложения, если у вас много отпечатков.
вы можете попробовать написать в stderr, а не stdout.
fprintf(stderr, "Hello, please enter your age\n");
вы также должны взглянуть на этой соответствующей теме.
как указывали другие, вывод может быть буферизован в вашей программе, прежде чем консоль или оболочка сможет его увидеть.
в unix-подобных системах, включая Mac,stdout
по умолчанию имеет линейную буферизацию. Это означает, что ваша программа опустошает свой stdout
buffer, как только он видит новую строку.
однако в windows новые строки больше не являются специальными, и используется полная буферизация. Windows вообще не поддерживает буферизацию строк; см. страница msdn на setvbuf.
Итак, в windows хороший подход-полностью отключить stdout
буферизация вот так:
setvbuf (stdout, NULL, _IONBF, 0);
- в папке проекта создать ".файл gdbinit" текстовый файл. Он будет содержать конфигурацию отладчика gdb
- изменить ".gdbinit", и добавить строку (без кавычек): "set new-console on"
после построения проекта щелкните правой кнопкой мыши на отладке проекта > "конфигурации отладки", как показано ниже
на вкладке " отладчик "убедитесь, что" командный файл GDB "теперь указывает на ваш".файл gdbinit". В противном случае введите путь к твой." файл gdbinit" файл конфигурации :
нажмите "Применить" и "отладка". Собственная командная строка DOS должна быть запущена, как показано ниже
добавить c:\gygwin\bin
до PATH
переменная среды либо как системная переменная среды, либо в вашем проекте eclipse (свойства-> выполнить/отладка-> изменить)