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 (). Обратите внимание, что это будет сильно влияет на производительность приложения, если у вас много отпечатков.


попробуйте установить это перед печатью:

setvbuf (stdout, NULL, _IONBF, 0);

вы можете попробовать написать в 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);

  1. в папке проекта создать ".файл gdbinit" текстовый файл. Он будет содержать конфигурацию отладчика gdb
  2. изменить ".gdbinit", и добавить строку (без кавычек): "set new-console on"
  3. после построения проекта щелкните правой кнопкой мыши на отладке проекта > "конфигурации отладки", как показано ниже Debug configuration

  4. на вкладке " отладчик "убедитесь, что" командный файл GDB "теперь указывает на ваш".файл gdbinit". В противном случае введите путь к твой." файл gdbinit" файл конфигурации : Gdb configuration

  5. нажмите "Применить" и "отладка". Собственная командная строка DOS должна быть запущена, как показано ниже Console


добавить c:\gygwin\bin до PATH переменная среды либо как системная переменная среды, либо в вашем проекте eclipse (свойства-> выполнить/отладка-> изменить)