Как остановить немедленное завершение работы консольного приложения C++?
в последнее время я пытаюсь изучить C++ от этот сайт. К сожалению, всякий раз, когда я пытаюсь запустить один из примеров кода, я вижу, что программа открывается примерно на полсекунды, а затем сразу закрывается. Есть ли способ остановить программу от немедленного закрытия, чтобы я мог видеть плоды своих усилий?
30 ответов:
Edit: как справедливо указывает Чарльз Бейли в комментарии ниже, это не будет работать, если есть символы, буферизованные в
stdin, и нет действительно хорошего способа обойти это. Если вы работаете с подключенным отладчиком, Джон Диблинг предложил решение это, вероятно, самое чистое решение вашей проблемы.тем не менее, я оставлю это здесь, и, возможно, кто-то еще найдет это полезным. Я использовал его много как быстрый Хак видов, когда написание тестов во время разработки.
в конце
mainфункция, вы можете вызватьstd::getchar();это будет один символ из
stdin, таким образом, давая вам "нажмите любую клавишу, чтобы продолжить" вид поведения (если вы на самом деле хотите сообщение "нажмите любую клавишу", вам придется распечатать его самостоятельно).вам нужно
#include <cstdio>наgetchar.
Если вы используете Visual Studio и запускаете консольное приложение из IDE:
клавишей CTRL-F5 (запуск без отладки) запустит приложение и будет держать окно консоли открытым, пока вы не нажмете любую клавишу.
решение Джеймса работает для всех платформ.
также на
Windowsвы также можете добавить следующее непосредственно перед возвращением изmainфункция:system("pause");это будет работать
pauseкоманда, которая ждет, пока вы нажмете клавишу, а также отображает хорошее сообщениеPress any key to continue . . .
Если вы используете Microsoft Visual C++ 2010 Express и столкнетесь с проблемой с CTRL+F5 не работает для сохранения консоли открытой после завершения программы, взгляните на этот поток MSDN.
вероятно, ваша IDE настроена на закрытие консоли после запуска CTRL+F5; фактически, "пустой проект" в Visual C++ 2010 закрывает консоль по умолчанию. Чтобы изменить это, сделайте так, как предложил модератор Microsoft:
пожалуйста, правильно щелкните имя проекта и перейдите на страницу свойства, разверните свойства конфигурации -> Компоновщик -> система, выберите консоль (/SUBSYSTEM:CONSOLE) в раскрывающемся списке подсистема. Потому что, по умолчанию, пустой проект не указывает его.
Я обычно просто ставлю точку останова на
main()закрывающая фигурная скобка. Когда конец программы будет достигнут любыми средствами, точка останова ударит, и вы можете ALT-Tab в окно консоли для просмотра вывода.
Почему бы просто не запустить программу из консоли ie запустить программу из cmd.exe, если вы используете Windows. Таким образом, окно остается открытым после завершения программы.
[EDIT]: когда я использую KDevelop4, есть полноценный экземпляр Bash (Linux CLI), работающий на вкладке в нижней части IDE. Это то, что я использую в таких обстоятельствах.
перед окончанием кода вставьте следующую строку:
system("pause");это будет держать консоль, пока вы не нажмете клавишу.
#include <iostream> #include <string> using namespace std; int main() { string s; cout << "Please enter your first name followed by a newline\n"; cin >> s; cout << "Hello, " << s << '\n'; system("pause"); // <---------------------------------- return 0; // This return statement isn't necessary }
Если вы запускаете свой код из компетентной IDE, например Code:: Blocks, IDE будет управлять консолью, которую он использует для запуска кода, сохраняя ее открытой при закрытии приложения. Вы не хотите добавлять специальный код, чтобы держать консоль открытой, потому что это помешает ей работать правильно, когда вы используете ее для реального, вне IDE.
хорошо, я предполагаю, что вы находитесь на Windows, используя Visual Studio... зачем? Ну, потому что если вы находитесь на какой-то ОС Linux, то вы, вероятно, будете запускать его с консоли.
в любом случае, вы можете добавить дерьмо в конце вашей программы, как другие предлагают, или вы можете просто нажать CTRL + F5 (запуск без отладки)и Visual Studio оставит консоль после завершения.
другой вариант, если вы хотите запустить отладочную версию и не добавить хрень ваш код, чтобы открыть окно консоли (Пуск -> Выполнить -> cmd) и перейдите в папку отладка выходного каталога. Затем просто введите имя исполняемого файла, и он будет запускать программу отладки в консоли. Затем вы можете использовать приложение Visual Studio для процесса или что-то еще, если вы действительно хотите.
Если вы действительно отлаживаете приложение в Visual C++, нажмите F5 или зеленый треугольник на панели инструментов. Если вы на самом деле не отлаживаете его (у вас нет установленных точек останова), нажмите Ctrl+F5 или выберите "пуск без отладки" в меню (обычно это меню отладки, которое я согласен, сбивает с толку.) Это будет немного быстрее, и что более важно для вас, будет пауза в конце без необходимости изменения кода.
кроме того, откройте командную строку, перейдите в папка, в которой находится ваш exe, и запустите его, введя его имя. Таким образом, когда он закончит работу, командная строка не закрывается, и вы можете видеть вывод. Я предпочитаю оба этих метода для добавления кода, который останавливает приложение так же, как его закончил.
добавьте следующую строку в конце программы. Он будет пытаться захватить некоторую форму пользовательского ввода, таким образом, он останавливает консоль от автоматического закрытия.
cin.get();
для Visual Studio (и только Visual Studio) следующий фрагмент кода дает вам приглашение "ждать нажатия клавиши для продолжения", которое действительно ждет, когда пользователь нажмет новая ключ явно, сначала промыв входной буфер:
#include <cstdio> #include <tchar.h> #include <conio.h> _tprintf(_T("Press a key to continue ")); while( _kbhit() /* defined in conio.h */ ) _gettch(); _gettch();обратите внимание, что это использует
tchar.hмакрос должен быть совместим с несколькими "наборами символов" (как их называет VC++).
Я просто делаю это:
//clear buffer, wait for input to close program std::cin.clear(); std::cin.ignore(INT_MAX, '\n'); std::cin.get(); return 0;Примечание: очистка буфера cin и такие необходимы только в том случае, если вы использовали cin в какой-то момент ранее в вашей программе. Также использование std::numeric_limits:: max (), вероятно, лучше, чем INT_MAX, но это немного многословно и обычно не нужно.
использовать
#include "stdafx.h"&system("pause");так же, как код ниже.#include "stdafx.h" #include <iostream> using namespace std; int main() { std::cout << "hello programmer!\n\nEnter 2 numbers: "; int x, y; std::cin >> x >> y; int w = x*y; std::cout <<"\nyour answer is: "<< w << endl; system("pause"); }
подобная идея е ответ, просто минималистская альтернатива.
создайте пакетный файл со следующим содержимым:
helloworld.exe pauseзатем используйте пакетный файл.
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; int main() { cout << "Press any key to continue..."; getch(); return 0; }Я не заметил, что кто-то еще опубликовал это, так что вот оно.
смотрите, если ваша IDE имеет флажок в настройках проекта, чтобы сохранить окно открытым после завершения программы. Если нет, используйте
std::cin.get();читать Символ в конце основной функции. Однако не забудьте использовать только строчный ввод (std::getline) или иметь дело с оставшимися непрочитанными символами в противном случае (std::ignore until newline), потому что в противном случае .get () в конце будет читать только мусор, который вы оставили непрочитанным ранее.
Это, кажется, работает хорошо:
cin.clear(); cin.ignore(2);Если вы сначала очистите буфер, это не будет проблемой при чтении следующего. Почему-то
cin.ignore(1)не работает, это должно быть 2.
все, что вам нужно сделать, установить переменную x, то просто введите это в перед return 0;
cout<<"\nPress any key and hit enter to end..."; cin>>x;
вы даже можете объявить целое число в начале (скажем
int a;) и поставитьstd::cin >> a;непосредственно перед возвращаемым значением. Поэтому программа будет продолжать работать, пока вы не нажмете клавишу и входите.
вы всегда можете просто создать пакетный файл. Например, если ваша программа называется helloworld.exe, какой-то код будет:
@echo off :1 cls call helloworld.exe pause >nul goto :1
Я
cin.get()и это работало, но в один прекрасный день мне нужно было использовать другойcin.get([Array Variable])перед этим, чтобы захватить строку ling с пустым символом в середине. так чтоcin.get()не удалось избежать закрытия окна командной строки. Наконец я нашел другой способ: Нажмите CTRL+F5 чтобы открыть во внешнем окне и Visual Studio больше не имеет контроля над ним. Просто спросит вас о закрытии после запуска финальных команд.
я попробовал поставить
getchar()функция в конце. Но это не сработало. Так что я сделал, чтобы добавить дваgetchar()функции одну за другой. Я думаю, что первыйgetchar()поглощает введите клавишу нажать после последнего ввода данных. Так что попробуйте добавить дваgetchar()функции вместо одного
вместо того, чтобы нажимать кнопку запуска, нажмите CTRL и F5 одновременно, это даст вам нажать любую клавишу, чтобы продолжить сообщение. Или типа " (предупреждение используйте это только для тестирования не реальных программ, так как антивирусы не любят его!!!!) "в конце вашей основной функции, но: (предупреждение используйте это только для тестирования не фактических программ, так как антивирусы этого не любят!!!!)
просто используйте cin.игнорировать() прямо перед возвращением 0; дважды
main() { //your codes cin.ignore(); cin.ignore(); return 0; }вот и все
если вы используете Windows, то вы можете сделать
system("pause >nul");илиsystem("pause");. Он выполняет консольную команду, чтобы приостановить программу, Пока вы не нажмете клавишу.>nulмешает ему говоритьPress any key to continue....
Comments