Запобігання закриттю вікна консолі у програмі Visual Studio C / C ++ Console


464

Це, мабуть, хвилююче питання, оскільки, без сумніву, відповідь сліпо очевидна.

Я використовував Visual Studio протягом багатьох років, але це перший раз, коли я робив будь-яку розробку "Консольного додатка".

Коли я запускаю свою програму, з’являється вікно консолі, з’являється вихід програми, а потім вікно закривається, коли програма закривається.

Чи є спосіб або тримати його відкритим, поки я не перевірив вихід, або переглянути результати після закриття вікна?


Monodevelop робить те, що ви очікуєте.
ctrl-alt-delor

3
Нижче наведено занадто багато відповідей, тому я копіюю відповідь тут: якщо ви використовуєте VS2017, то Інструменти-> Параметри-> Налагодження-> Автоматично закрийте консоль
jw_

Домовились. Я думаю, що найкраща відповідь для VS 2017 та новіших - відповідь chronoxor.
Усі

Відповіді:


466

Якщо ви запускаєте без налагодження (Ctrl + F5), то за замовчуванням він запропонує натиснути return, щоб закрити вікно. Якщо ви хочете скористатися налагоджувачем, слід поставити точку перерви в останньому рядку.


268
Якщо у вас є додаток C ++ і запускати без налагодження, і вікно консолі все ще закривається, вам потрібно пам’ятати, щоб явно встановити підсистему на консолі в розділі Властивості конфігурації / Linker / System. Це може статися, якщо ви почнете з порожнього проекту, який залишає підсистему невстановленою.
Тревор Робінсон

4
Не працювало для мене :( Вікно консолі відкривається та негайно закривається, але журнал зупиняється та чекає додаткового натискання клавіші F5
CodyBugstein

40
Правильна відповідь - відповідь @TrevorRobinson: Ось розширена версія, якщо у вас виникли проблеми з визначенням, де розташовані властивості конфігурації: Клацніть правою кнопкою миші ваш проект у Visual Studio> Властивості> Властивості конфігурації> Linker> Система, змініть підсистему на " Консоль "
PlagueHammer

3
Тревор Робінсон має рацію. Якщо ви запустили порожній проект та пункт C ++. Вам потрібно перейти до Перегляд-> Менеджер властивостей-> Властивість (значок гайкового ключа) -> Налаштувати. Властивості-> Linker-> System-> Підсистема-> у спливаючому меню виберіть Console.
найповажніший сер

10
Я працюю над VS-спільнотою 2017. ctrl+f5Не працюю, немає, Propertiesколи я клацну правою кнопкою миші на проект, також wrench iconсірий.
Кетан

232

Клацніть правою кнопкою миші на вашому проекті

Властивості> Властивості конфігурації> Linker> System

Виберіть Console (/ Subsystem: CONSOLE) в SubSystemопції або ви можете просто ввести консоль в текстовому полі!

Тепер спробуйте ... це повинно працювати


Це спрацювало на моєму VS2013 Express, але прийнята відповідь не відповіла. Дуже дивно, оскільки прийнята відповідь працювала для всіх версій Visual Studio, які я використовував у минулому.
Майкл Кальвін

9
@MichaelCalvin Ви повинні запустити Ctrl + F5 після встановлення цього пункту.
Джонатан Мі

як @JonathanMee заявив, що ви все ще виконуєте Ctrl + F5. Це було встановлено у моїй візуальній студії 2015 року, тому перша відповідь була та, яка найбільше допомогла.

Це дійсно правильно. Знайоме CTRL+F5не вдасться, якщо ви, скажімо, додасте новий файл C ++ до порожнього проекту.
користувач2023370

Працював для мене на 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 ++ (якщо ви не включите заголовок?)
wmac

2
@wmac Ви повинні включити заголовок windows.h
Geowil

1
Я не включив будь-яку бібліотеку чи простір імен, але він працює правильно, спасибі велике.
Халіл Ібрагім Оймамі

1
Не робіть цього, будь ласка. pauseКоманда Windows , специфічні.
firegurafiku

Працював для мене у Visual Studio 2013 Express. :)
Анірбан

32

Відкрийте меню налагодження-> Натисніть кнопку StartWithoutDebugging


Це навіть не варіант у VS 2008, якщо не було обрано середовище розробки C #. CTRL + F5 працює. Ви також можете додати це як кнопку на панелі інструментів через Інструменти> Налаштувати.
perry

Якщо у вас кілька проектів, встановіть відповідний проект як стартовий проект
CAD блокується

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 (), консоль все ще закривається. Яка угода?
perry

1
Спробуйте поставити getchar () двічі, якщо у вас є кут безпосередньо перед getchar (). getchar () очікує чару, і ви вже даєте йому кут ... Дайте мені знати, чи допоможе це :)
Магарусу

12

(/ SUBSYSTEM: CONSOLE) не працював для мого vs2013 (у мене його вже було).

"запустити без налагодження" - це не варіант, оскільки я не хочу перемикатися між налагодженням і бачити вихід.

Я закінчив с

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

Розчин, що використовується в qtcreator до 2.6. Тепер, коли qt зростає, проти йде інший шлях. Як я пам’ятаю, у 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, на відміну від усіх інших відповідей.
Мартін Геннінгс


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 (+ ОС незалежна, якщо ви використовуєте cin.sync(); cin.ignore();трюк замість system("pause");)

Мінуси:

  • повинні змінити код
  • не зупиняється на std :: терміново ()
  • все одно відбуватиметься у вашій програмі поза сеансом IDE / налагодження; Ви можете запобігти цьому в Windows за допомогою:

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

Дуже погана порада.
ура та хт. - Альф

Чи можете ви пояснити, чому?
GhassanPL

У випадку, коли хто не налагоджує, він нічого корисного не робить, тому що в цьому випадку проблеми не вирішуються. У VS просто запустіть програму з Ctrl + F5, і це все, так що в VS проблем немає, а в інтерпретаторі команд немає жодної проблеми, словом, немає проблеми. І в тому випадку, коли хтось налагоджує і хоче зупинити, доданий код зупиняється - не зручніше рішення, ніж точка перерви, і втручається в ситуації, коли не хочеться зупинки.
ура та хт. - Альф

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.