Подтвердить что ты не робот

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, но я не думаю, что это решение элегантно и даже необходимо. Любые идеи о том, как я могу это преодолеть?

EDIT - потому что я изучаю это в своем университете, я не могу использовать что-либо, что не было изучено в курсе, поэтому я могу использовать printf и scanf

НОВЫЙ РЕДАКТ.. Думаю, я нашел для этого объяснение. Как я уже сказал, я выводил на консольный просмотр внутри Eclipse. Странно то, что, если я компилирую и запускаю программу из командной строки Windows, я получаю желаемый результат. Поэтому я думаю, что eclipse фактически записывает вывод в файл и представляет его в окне консоли. Как заставить eclipse открыть окно реальной командной строки в моих конфигурациях запуска?

4b9b3361

Ответ 1

По-видимому, это известная ошибка Eclipse. Эта ошибка разрешена с разрешением WONT-FIX. Однако я понятия не имею, почему. Ссылка здесь: Ошибка Eclipse C Console.

Ответ 2

Вывод буферизуется.

stdout по умолчанию используется для буферизации по строке, что означает, что '\n' предполагается сбросить буфер. Почему это не происходит в вашем случае? Не знаю. Вам нужно больше информации о вашем приложении/среде.

Однако вы можете управлять буферизацией с помощью setvbuf():

setvbuf(stdout, NULL, _IOLBF, 0);

Это приведет к тому, что stdout будет буферизироваться по строке.

setvbuf(stdout, NULL, _IONBF, 0);

Это заставит stdout быть небуферизованным, поэтому вам не нужно будет использовать fflush(). Обратите внимание, что это сильно повлияет на производительность приложения, если у вас много отпечатков.

Ответ 3

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

setvbuf (stdout, NULL, _IONBF, 0);

Ответ 4

Вы можете попробовать написать stderr, а не stdout.

fprintf(stderr, "Hello, please enter your age\n");

Вы также должны взглянуть на этот соответствующий поток.

Ответ 5

Как указывали другие, вывод может быть буферизирован внутри вашей программы, прежде чем консоль или оболочка смогут увидеть ее.

В unix-подобных системах, включая macs, stdout по умолчанию использует буферизацию на основе строки. Это означает, что ваша программа опустошает свой буфер stdout, как только увидит новую строку.

Однако в окнах новые строки больше не являются специальными, и используется полная буферизация. Windows вообще не поддерживает буферизацию строк; см. страницу msdn на setvbuf.

Итак, в окнах хороший подход - полностью отключить буферизацию stdout следующим образом:

setvbuf (stdout, NULL, _IONBF, 0);

Ответ 6

  • В папке проекта создайте текстовый файл .gdbinit. Он будет содержать конфигурацию отладчика gdb.
  • Изменить ".gdbinit" и добавить строку (без кавычек): "установить новую консоль"
  • После создания проекта щелкните правой кнопкой мыши проект Debug > "Debug Configurations", как показано ниже Debug configuration

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

  • Нажмите "Применить" и "Отладить". Командная строка DOS должна быть запущена, как показано ниже. Console

Ответ 7

Добавьте переменную среды c:\gygwin\bin в PATH как переменную системной среды или в проект eclipse (properties- > run/debug- > edit)