Как сохранить окно консоли открытым в Visual C++?
Я начинаю с Visual C++, и я хотел бы знать, как сохранить окно консоли.
Например, это будет типичное приложение "Hello World":
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
Какую черту я пропускаю?
23 ответа
Начните проект с Ctrl+F5 вместо просто F5.
Теперь окно консоли будет оставаться открытым Press any key to continue . . .
сообщение после выхода из программы.
Обратите внимание, что это требует Console (/SUBSYSTEM:CONSOLE)
опция компоновщика, которую вы можете включить следующим образом:
- Откройте свой проект и перейдите в Solution Explorer. Если вы следите за мной в K&R, ваше "Решение" будет "Привет" с одним проектом под ним, также "Привет" выделено жирным шрифтом.
- Щелкните правой кнопкой мыши на "привет" (или как называется ваш проект.)
- Выберите "Свойства" из контекстного меню.
- Выберите "Свойства конфигурации"> "Линкер"> "Система".
- Для свойства "Подсистема" в правой панели щелкните раскрывающийся список в правом столбце.
- Выберите "Консоль (/SUBSYSTEM:CONSOLE)"
- Нажмите "Применить", подождите, пока он закончит делать все, что он делает, затем нажмите "ОК". (Если "Применить" выделено серым цветом, выберите другой параметр подсистемы, нажмите "Применить", затем вернитесь и примените параметр консоли. Мой опыт показывает, что само по себе "ОК" не будет работать.)
CTRL-F5 и подсказки подсистемы работают вместе; они не являются отдельными вариантами.
(Предоставлено DJMorreTX от http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6)
Стандартный способ cin.get()
до вашего возвращения.
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
cin.get();
return 0;
}
Установите точку останова на return
линия.
Вы запускаете его в отладчике, верно?
Другой вариант заключается в использовании
#include <process.h>
system("pause");
Хотя это не очень портативный, потому что он будет работать только на Windows, но он будет автоматически печатать
Нажмите любую клавишу для продолжения...
Как уже отмечалось, решение Zoidbergs не подключает отладчик, чего вам обычно не нужно.
Наилучшим вариантом является настройка вашего VS соответствующим образом (начиная с VS 2017 и далее), выбрав Инструменты> Параметры> Отладка> Общие. Там вы снимаете флажок "Автоматически закрывать консоль при остановке отладки" (в самом низу), который, вероятно, отмечен в вашем случае.
Для проектов makefile принятое решение терпит неудачу из-за ошибки в Visual Studio (которая присутствует по крайней мере до версии 2012 - я еще не тестировал 2013). Эта ошибка подробно описана здесь.
Чтобы консоль приостановилась после завершения программы в проекте makefile, выполните следующие действия (это может отличаться для версий, отличных от 2010 - 2012):
1) пройти /SUBSYSTEM:CONSOLE
компоновщику. - РЕДАКТИРОВАТЬ: см. Ниже.
2) Откройте файл вашего проекта (.vcxproj) в текстовом редакторе.
3) Внутри корня <project>
тег, вставьте следующее:
<ItemDefinitionGroup> <Link> <SubSystem>Console</SubSystem> </Link> </ItemDefinitionGroup>
4) Перезагрузите проект в вашем решении.
5) Запустите программу без отладки (CTRL + F5).
РЕДАКТИРОВАТЬ:
Согласно моему комментарию ниже, настройка опции компоновщика /SUBSYSTEM:CONSOLE
на самом деле не имеет значения для проектов makefile (и не обязательно даже возможно, если вы используете компилятор, отличный от MSVC). Все, что имеет значение, это то, что параметр добавляется в файл.vcxproj, как описано в шаге 3 выше.
Ты можешь использовать cin.get();
или же cin.ignore();
непосредственно перед вашим оператором return, чтобы избежать закрытия окна консоли.
Просто поставьте точку останова на последней фигурной скобке main.
int main () {
//...your code...
return 0;
} //<- breakpoint here
это работает для меня, нет необходимости работать без отладки. Он также выполняет деструкторы перед достижением точки останова, поэтому вы можете проверить любые сообщения, напечатанные на этих деструкторах, если они у вас есть.
Просто добавьте точку останова к закрывающей скобке вашего _tmain
метод. Это более простой способ, плюс вам не нужно добавлять код для отладки.
Просто добавьте system("pause") в конце кода перед возвратом 0, как это
int main()
{
some code goes here
system("pause")
return 0;
}
cin.get() или system("PAUSE"). Я не слышал, что вы можете использовать return(0);
Поместите точку останова на конечную скобку main()
, Это будет срабатывать даже с несколькими return
заявления. Единственным недостатком является то, что призыв к exit()
не будет пойман
Если вы не отлаживаете, следуйте советам в ответе Зойдберга и запустите вашу программу с помощью Ctrl+F5 вместо просто F5.
Мои 2 цента:
Вариант 1: Добавить точку останова в конце main()
Вариант 2: добавьте этот код прямо перед return 0;
:
std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Вы должны включить <iomanip>
за std::numeric_limits
Другой вариант:
#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif
В основном:
int main(int argc, char* argv[]) {
MAINRET;
}
Была такая же проблема. Я использую _getch() непосредственно перед оператором возврата. Оно работает.
Я включаю #include <conio.h>
а затем добавить getch();
как раз перед return 0;
линия. Это то, чему я научился в школе. Методы, упомянутые выше, совершенно другие, я вижу.
У меня такая же проблема; В моем приложении есть несколько точек выхода (), и не было никакого способа узнать, где именно оно выходит, тогда я узнал об этом:
atexit(system("pause"));
или же
atexit(cin.get());
Таким образом, это остановится независимо от того, где мы выйдем из программы.
Собственно, реальным решением является выбор самого шаблона проекта. Вы ДОЛЖНЫ выбрать Консольное приложение Win32 в более старой версии VS или сначала ввести имя проекта, а затем дважды щелкнуть мастер Windows Desktop, а затем выбрать консольное приложение Win32. Затем выберите пустой проект в этой точке. Это позволяет учесть то, что действительно хотел первоначальный спрашивающий, без добавления дополнительной точки остановки и кода удержания. Я также прошел через эту проблему. Ответ также на сайте MSDN.
Вот способ сохранить командное окно открытым независимо от того, как выполнение останавливается без изменения какого-либо кода:
В Visual Studio откройте Страницы свойств проекта -> Отладка.
Для команды введите $(ComSpec)
В качестве аргументов команды введите /k $(TargetPath)
, Добавьте любые аргументы в ваше собственное приложение.
Теперь F5 или Ctrl-F5 запускает Windows/System32/cmd.exe в новом окне, а /k гарантирует, что командная строка остается открытой после завершения выполнения.
Недостатком является то, что выполнение не остановится на контрольных точках.
(Некоторые варианты могут называться разными именами. Я не использую английскую версию)
У меня была такая же проблема, когда я создавал проекты с опцией "пустой проект", создайте проект как "Win32-консольное приложение" вместо "пустой проект" . В появившемся диалоговом окне вы нажимаете "продолжить", после чего вы можете проверить опцию "пустой проект" и нажать "Подтвердить" . После этого CTRL + F5 откроет консоль, которая не закрывается автоматически.
Сразу после включения YWstd::cin.clear(); // сбросить все флаги ошибок std::cin.ignore(std::numeric_limitsstd::streamsize::max(), '\n'); // игнорируем любые символы во входном буфере, пока не найдем символ ввода std::cin.get(); // получаем еще один символ от пользователя
Вы можете просто поставить keep_window_open (); до возвращения здесь один пример
int main()
{
cout<<"hello world!\n";
keep_window_open ();
return 0;
}