Предотвращение закрытия окна консоли в консольном приложении 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 в текстовое поле!

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

Viraj
источник
Это сработало для моего 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, консоль не должна закрываться при выходе из программы.

Shaun
источник
Этот метод не работает в Visual C ++ (если вы не
включите
2
@wmac Вы должны включить заголовок windows.h
Geowil
1
Я не включил ни одну библиотеку или пространство имен, но он работает правильно, большое спасибо.
Халил Ибрагим Оймачи
1
Не делай этого, пожалуйста. Команда pauseзависит от Windows.
Firegurafiku
Работал для меня на Visual Studio 2013 Express. :)
Anirban
32

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

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

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

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

Cheeso
источник
9
+1 - Либо это, либо Console.ReadKey()просто ждать любую клавишу.
Фредрик Мёрк
Странно, это не влияет на мое приложение. Он по-прежнему закрывается без ожидания ввода пользователя.
Кокодоко
4
Тогда ваш код, скорее всего, завершается до того, как достигнет этой точки.
Действительно
20

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

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

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

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

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

chronoxor
источник
2
Я только что проверил это в VS2017 и VS2019. Это требует как установки подсистемы на CONSOLE, так и отключения этой опции. Наличие одного или другого или ни того, ни другого не закрывает окно автоматически.
Кейси
Это все еще закрывает окно для меня, если я запускаю несколько проектов из одного решения.
Серж Рогач
Я чувствую, что это правильный ответ для VS 2017 и вперед. Жаль, что это не в старых версиях.
Вся Ярость
13

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

Magarusu
источник
Не работает в 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 нам не нужны были такие хитрости.

fantastory
источник
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по этому, но безуспешно.

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

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

system("pause");
RefaelJan
источник
3

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

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

return YOUR_MAIN_CODE;

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

Geo
источник
3

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

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

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

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

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

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

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

carefulnow1
источник
когда я делаю 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"); });
    ...
}
GhassanPL
источник
Очень плохой совет.
ура и hth. - Альф
Можете ли вы объяснить, почему?
GhassanPL
В случае, если не происходит отладка, это не делает ничего полезного, потому что в этом случае нет проблем, которые необходимо решить. В VS просто запустите программу с помощью Ctrl + F5 и все, так что в VS нет проблем, а в интерпретаторе команд нет проблем, короче говоря, нет проблем. И в случае, когда кто-то отлаживает и хочет, чтобы остановленный добавленный код останавливался, это не более удобное решение, чем точка останова, и он вмешивается в ситуации, когда не требуется остановка.
ура и hth. - Альф
2

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

  1. cin.get();

или

  1. system("pause");

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

AAEM
источник
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;
}
JMI MADISON
источник