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


464

Это, вероятно, смущающий вопрос, так как, несомненно, ответ очевиден.

Я использовал Visual Studio много лет, но впервые я разрабатывал «Консольное приложение».

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

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


Monodevelop делает то, что вы ожидаете.
Ctrl-Alt-Delor

3
Ниже приведено слишком много ответов, поэтому я скопирую ответ здесь: если вы используете VS2017, то выберите Инструменты-> Параметры-> Отладка-> Автоматически закрыть консоль
jw_

Согласовано. Я думаю, что лучший ответ для VS 2017 и новее - это chronoxor.
Вся ярость

Ответы:


466

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


268
Если у вас есть приложение на C ++ и «Выполнить без отладки», а окно консоли по-прежнему закрывается, вам нужно не забыть явно установить для Подсистемы значение «Консоль» в разделе «Свойства конфигурации / Linker / System». Это может произойти, если вы начинаете с пустого проекта, который оставляет подсистему неустановленной.
Тревор Робинсон

4
У меня не сработало :( Окно консоли открывается и сразу закрывается, но журнал останавливается и ждет дополнительного нажатия F5
CodyBugstein

40
Правильный ответ - @TrevorRobinson: вот расширенная версия, если у вас возникли проблемы с поиском свойств конфигурации: щелкните правой кнопкой мыши свой проект в Visual Studio> Свойства> Свойства конфигурации> Линкер> Система, измените Подсистему на " Консоль "
PlagueHammer

3
Тревор Робинсон прав. Если вы запускаете пустой проект и C ++ элемент. Вам нужно перейти в View-> Property Manager-> Property (значок гаечного ключа) -> Config. Свойства-> Линкер-> Система-> Подсистема-> во всплывающем меню выберите Консоль.
самый почтенный сэр

10
Я работаю над сообществом VS 2017. ctrl+f5не работает, нет, Propertiesкогда я щелкаю правой кнопкой мыши проект, также wrench iconсерый цвет.
Кетан

232

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

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

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

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


Это сработало для моего VS2013 Express, но принятого ответа нет. Очень странно, поскольку принятый ответ работал для всех версий Visual Studio, которые я использовал в прошлом.
Майкл Кэлвин

9
@MichaelCalvin Вы должны запустить с Ctrl + F5 после установки этого, это кикер.
Джонатан Ми

как сказал @JonathanMee, вы все еще используете Ctrl + F5. Это было уже установлено в моей визуальной студии 2015, поэтому первым ответом был тот, который помог больше всего.

Это действительно правильно. Знакомый CTRL+F5потерпит неудачу, если вы, скажем, добавите новый файл C ++ в пустой проект.
user2023370

Работал для меня на Visual Studio Express 2015. Спасибо.
LHC

44

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

#include <stdlib.h>

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

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


Этот метод не работает в Visual C ++ (если вы не
включите

2
@wmac Вы должны включить заголовок windows.h
Geowil

1
Я не включил ни одну библиотеку или пространство имен, но он работает правильно, большое спасибо.
Халил Ибрагим Оймачи

1
Не делай этого, пожалуйста. Команда pauseзависит от Windows.
Firegurafiku

Работал для меня на Visual Studio 2013 Express. :)
Anirban

32

Перейти к меню отладки-> Нажмите Пуск без отладки


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

Если у вас есть несколько проектов, установите соответствующий в качестве стартового проекта
CAD bloke

27

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

Это будет ждать <ENTER>.


9
+1 - Либо это, либо Console.ReadKey()просто ждать любую клавишу.
Фредрик Мёрк

Странно, это не влияет на мое приложение. Он по-прежнему закрывается без ожидания ввода пользователя.
Кокодоко

4
Тогда ваш код, скорее всего, завершается до того, как достигнет этой точки.
Действительно

20

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

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

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

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

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


2
Я только что проверил это в VS2017 и VS2019. Это требует как установки подсистемы на CONSOLE, так и отключения этой опции. Наличие одного или другого или ни того, ни другого не закрывает окно автоматически.
Кейси

Это все еще закрывает окно для меня, если я запускаю несколько проектов из одного решения.
Серж Рогач

Я чувствую, что это правильный ответ для VS 2017 и вперед. Жаль, что это не в старых версиях.
Вся Ярость

13

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


Не работает в VS 2008 для простого консольного приложения Hello Name. cout, cin, cout, getchar (), консоль все еще закрывается. В чем дело?
Перри

1
Попробуйте поставить getchar () дважды, если у вас есть cout перед getchar (). getchar () ожидает char, а вы уже передаете его cout ... Дайте мне знать, если это поможет :)
Magarusu

12

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

«запустить без отладки» не вариант, так как я не хочу переключаться между отладкой и просмотром вывода.

Я закончил с

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

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


7

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

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

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

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

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

  3. Измените «Аргументы команды» на $(TargetPath)(или что-либо в «Команде»).
  4. Измените «Command» на полный путь к runthenpause.bat.
  5. Хит ОК.

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

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


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

6

просто введите в качестве последней строки кода:

system("pause");

3

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

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

return YOUR_MAIN_CODE;

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


3

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


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

3

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

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

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

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

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


когда я делаю cntrl + f5, он открывается, а затем закрывается сразу? как ты это исправляешь?
Каллат

Второе решение было то, что я искал!
RoG

Когда я нажимаю Ctrl + F5, ничего не происходит. Раньше он работал на меня, но внезапно перестал работать.
Наташа

2

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

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

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

Плюсы:

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

Минусы:

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

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}

Очень плохой совет.
ура и hth. - Альф

Можете ли вы объяснить, почему?
GhassanPL

В случае, если не происходит отладка, это не делает ничего полезного, потому что в этом случае нет проблем, которые необходимо решить. В VS просто запустите программу с помощью Ctrl + F5 и все, так что в VS нет проблем, а в интерпретаторе команд нет проблем, короче говоря, нет проблем. И в случае, когда кто-то отлаживает и хочет, чтобы остановленный добавленный код останавливался, это не более удобное решение, чем точка останова, и он вмешивается в ситуации, когда не требуется остановка.
ура и hth. - Альф

2

Либо использовать:

  1. cin.get();

или

  1. system("pause");

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


2

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

#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;
}

2

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

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

0

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

#include <iostream>;

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.