Предотвращение закрытия окна консоли в консольном приложении Visual Studio C / C ++

420

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

Я использовал Visual Studio в течение многих лет, но это первый раз, когда я создал любую консольную программу.

Когда я запускаю приложение, появляется окно консоли, появляется выход программы, а затем окно закрывается по мере выхода приложения.

Есть ли способ открыть его, пока я не проверил вывод или не просмотрел результаты после закрытия окна?

  • 0
    Monodevelop делает то, что вы ожидаете.
Теги:
visual-studio
console

19 ответов

393
Лучший ответ

Если вы запускаете без отладки (Ctrl + F5), то по умолчанию он предлагает вам нажать return, чтобы закрыть окно. Если вы хотите использовать отладчик, вы должны поставить точку останова в последней строке.

  • 248
    Если у вас есть приложение на C ++ и «Выполнить без отладки», а окно консоли по-прежнему закрывается, вам нужно не забыть явно установить для Подсистемы значение «Консоль» в разделе «Свойства конфигурации / Linker / System». Это может произойти, если вы начинаете с пустого проекта, который оставляет подсистему неустановленной.
  • 2
    Вы также можете добавить кнопку «Пуск без отладки» на любую панель инструментов или меню, если хотите, если вы находитесь в диалоговом окне Tools->Customize...
Показать ещё 11 комментариев
190

Щелкните правой кнопкой мыши на вашем проекте

Свойства> Свойства конфигурации> Линкер> Система

Выберите Console (/SUBSYSTEM: CONSOLE) в опции SubSystem или вы можете просто ввести Console в текстовое поле!

Теперь попробуйте... это должно работать

  • 0
    Это сработало для моего VS2013 Express, но принятого ответа нет. Очень странно, поскольку принятый ответ работал для всех версий Visual Studio, которые я использовал в прошлом.
  • 3
    Это должен быть принятый ответ, включенный в текущий принятый ответ.
Показать ещё 4 комментария
40

Вот способ для C/С++:

#include <stdlib.h>

#ifdef _WIN32
    #define WINPAUSE system("pause")
#endif

Поместите это вверху вашей программы, и ЕСЛИ он находится в системе Windows (#ifdef _WIN32), тогда он создаст макрос с именем WINPAUSE. Всякий раз, когда вы хотите, чтобы ваша программа приостанавливалась, вызовите WINPAUSE;, и она приостанавливает программу, используя команду DOS. Для других систем, таких как Unix/Linux, консоль не должна выходить из выхода программы в любом случае.

  • 0
    Этот метод не работает в Visual C ++ (если вы не включите заголовок?)
  • 2
    @wmac Вы должны включить заголовок windows.h
Показать ещё 4 комментария
26

Откройте меню отладки- > Нажмите Начать без использования

  • 0
    Это даже не вариант в VS 2008, если не была выбрана среда разработки C #. CTRL + F5 работает, хотя. Вы также можете добавить это как кнопку на панель инструментов через Инструменты> Настроить.
  • 0
    Если у вас есть несколько проектов, установите соответствующий как стартовый проект
Показать ещё 1 комментарий
21

Если вы используете .NET, поместите Console.ReadLine() до конца программы.

Он будет ждать <ENTER>.

  • 9
    +1 - либо это, либо Console.ReadKey() чтобы просто подождать любую клавишу.
  • 44
    -1, модифицирующий код для работы вокруг IDE
Показать ещё 2 комментария
11

попробуйте вызвать getchar() прямо перед возвратом main().

  • 0
    Не работает в VS 2008 для простого консольного приложения Hello Name. cout, cin, cout, getchar (), консоль все еще закрывается. В чем дело?
  • 1
    Попробуйте поставить getchar () дважды, если у вас есть cout перед getchar (). getchar () ожидает char, а вы уже передаете его cout ... Дайте мне знать, если это поможет :)
10

(/SUBSYSTEM: CONSOLE) не работал для моего vs2013 (у меня его уже было).

"run without debugging" не является параметром, так как я не хочу переключаться между отладкой и просмотром вывода.

Я закончил с

int main() {
  ...
#if _DEBUG
  LOG_INFO("end, press key to close");
  getchar();
#endif // _DEBUG
  return 0;
}

Решение, используемое в qtcreator до 2.6. Теперь, когда qt растет, vs идет другим путем. Насколько я помню, в vs2008 нам не нужны такие трюки.

  • 0
    Это работает в VS 2015, хотя.
7

Здесь решение, что (1) не требует каких-либо изменений кода или точек останова, и (2) приостанавливается после завершения программы, чтобы вы могли видеть все, что было напечатано. Он остановится после F5 или Ctrl + F5. Основной недостаток заключается в том, что на VS2013 Express (как проверено) он не загружает символы, поэтому отладка очень ограничена.

  • Создайте командный файл. Я назвал мой runthenpause.bat со следующим содержимым:

    %1 %2 %3 %4 %5 %6 %7 %8 %9
    pause
    

    Первая строка будет запускать любую команду, которую вы предоставляете, и до восьми аргументов. Вторая строка будет... пауза.

  • Откройте свойства проекта | Конфигурационные свойства | Отладка.

  • Измените "Аргументы команд" на $(TargetPath) (или что-то еще в "Команде" ).
  • Измените "Команда" на полный путь до runthenpause.bat.
  • Нажмите ОК.

Теперь, когда вы запустите, runthenpause.bat запустит ваше приложение, и после того, как ваше приложение завершится, вы остановитесь, чтобы увидеть вывод консоли.

Я опубликую обновление, если выясню, как загрузить символы. Я пробовал /Z7 за этот, но безуспешно.

  • 1
    Это по-прежнему не поддерживает отладку, но, по крайней мере, решает проблему невозможности увидеть выходные данные, например, о VLD, в отличие от всех других ответов.
4

просто введите свою последнюю строку кода:

system("pause");
  • 1
    безусловно, самое простое решение.
2

Просто нажмите CNTRL + F5, чтобы открыть его во внешнем окне командной строки (Visual Studio не контролирует его).

Если это не сработает, добавьте следующее в конец вашего кода:

Console.WriteLine("Press any key to exit...");
Console.ReadKey();

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

Если вы хотите сделать это в нескольких местах, поместите вышеуказанный код в метод (например, private void Pause()) и вызовите Pause() всякий раз, когда программа достигает возможного конца.

  • 0
    когда я делаю cntrl + f5, он открывается, а затем закрывается сразу? как ты это исправляешь?
  • 0
    Прочитайте мое редактирование ...
Показать ещё 2 комментария
2

добавить "| pause" в поле аргументов команды в разделе отладки в свойствах проекта.

  • 4
    Это было бы отличным решением, если бы это работало. Кажется, что pause только в пакетных файлах, и хотя она получает данные от вашей программы на STDIN, она не перепечатывает этот текст. Я пытался заменить | с && , но это не имело никакого эффекта - вероятно, потому что это не выполняется с командной оболочкой (cmd.exe).
2

Вы можете запустить исполняемый файл из командной строки. Таким образом, вы можете увидеть весь вывод. Или вы можете сделать что-то вроде этого:

int a = 0;
scanf("%d",&a);

return YOUR_MAIN_CODE;

и таким образом окно не будет закрываться, пока вы не введете данные для переменной a.

1

Либо используйте:

  1. cin.get();

или

  1. system("pause");

Обязательно сделайте любой из них в конце функции main() и перед оператором return.

1

Несколько лучшее решение:

atexit([] { system("PAUSE"); });

в начале вашей программы.

Плюсы:

  • может использовать std:: exit()
  • может иметь несколько возвратов из основного
  • вы можете запустить свою программу под отладчиком
  • Независимый IDE (+ независимый от ОС, если вы используете трюк cin.sync(); cin.ignore(); вместо system("pause");)

Минусы:

  • необходимо изменить код
  • не будет останавливаться на std:: terminate()
  • все равно произойдет в вашей программе вне сеанса IDE/debugger; вы можете предотвратить это под Windows, используя:

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}
  • 0
    Очень плохой совет.
  • 0
    Можете ли вы объяснить, почему?
Показать ещё 1 комментарий
0

Начиная с Visual Studio 2017 (15.9.4) есть опция:

Tools->Options->Debugging->Automatically close the console

Соответствующий фрагмент из документации Visual Studio:

Автоматически закрывать консоль при остановке отладки:

Сообщает Visual Studio закрыть консоль в конце сеанса отладки.

0

В моем случае я испытал это, когда создал проект Empty C++ в версии VS 2017 для сообщества. Вам нужно будет установить для подсистемы значение "Консоль (/SUBSYSTEM: CONSOLE)" в разделе "Свойства конфигурации".

  1. Зайдите в "Просмотр", затем выберите "Менеджер недвижимости"
  2. Щелкните правой кнопкой мыши на проекте/решении и выберите "Свойство". Откроется страница свойств теста.
  3. Перейдите к компоновщику, затем выберите "Система"
  4. Нажмите "Подсистема" и появится выпадающий
  5. Выберите "Консоль (/SUBSYSTEM: CONSOLE)"
  6. Применить и сохранить
  7. В следующий раз, когда вы запустите свой код с помощью "CTRL +F5", вы должны увидеть результат.
0

Вы также можете использовать эту опцию

#include <conio.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main() {
   .
   .
   .
   getch(); 

   return 0;
}
-1

Visual Studio 2015, импорт. Потому что я ненавижу когда примеры кода не дают необходимых импортов.

#include <iostream>;

int main()
{
    getchar();
    return 0;
}
-4

Используйте console.readline. Ваш пишет строку, но не читает ее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню