Как закрыть консольное приложение c
в последнее время я пытаюсь изучить C++ от этот сайт. К сожалению, всякий раз, когда я пытаюсь запустить один из образцов кода, я вижу, что программа открывается примерно на полсекунды, а затем сразу закрывается. Есть ли способ остановить немедленное закрытие программы, чтобы я мог увидеть плоды своих усилий?
Edit: как справедливо указывает Чарльз Бейли в комментарии ниже, это не будет работать, если есть символы, буферизованные в stdin , и нет действительно хорошего способа обойти это. Если вы работаете с подключенным отладчиком, Джон Dibling это, вероятно, самое чистое решение вашей проблемы.
тем не менее, я оставлю это здесь, и, возможно, кто-то еще найдет это полезным. Я использовал его много как быстрый взлом, когда написание тестов во время разработки.
в конце main функция, вы можете вызвать std::getchar();
Если вы используете Visual Studio и запускаете консольное приложение из среды IDE:
клавишей сочетания клавиш Ctrl-клавишу F5 (запуск без отладки) запустит приложение и будет держать окно консоли открытым, пока вы не нажмете любую клавишу.
решение Джеймса работает для всех платформ.
также на Windows вы также можете добавить следующее непосредственно перед возвращением из main функция:
Если вы используете Microsoft Visual C++ 2010 Express и запускаете проблему с сочетание клавиш Ctrl+клавишу F5 не работает для сохранения консоли открытой после завершения программы, взгляните на этот поток MSDN.
вероятно, ваша IDE настроена на закрытие консоли после запуска CTRL+F5; фактически, "пустой проект" в Visual C++ 2010 закрывает консоль по умолчанию. Чтобы изменить это, сделайте так, как предложил модератор Microsoft:
пожалуйста, правильно щелкните имя проекта и перейдите на страницу свойства, разверните свойства конфигурации -> Компоновщик -> система, выберите консоль (/SUBSYSTEM:CONSOLE) в раскрывающемся списке подсистема. Потому что по умолчанию пустой проект не указывает его.
обычно я просто ставлю точку останова на main() закрывающая фигурная скобка. Когда конец программы достигается любыми средствами, точка останова ударит, и вы можете ALT-Tab в окно консоли для просмотра вывода.
Почему бы просто не запустить программу с консоли, т. е. запустить программу из cmd.exe, если вы используете Windows. Таким образом, окно остается открытым после завершения программы.
[EDIT]: когда я использую KDevelop4, есть полноценный экземпляр Bash (Linux CLI), работающий на вкладке в нижней части IDE. Именно это я и использую в подобных обстоятельствах.
вызов cin.get(); 2 раза:
перед окончанием кода вставьте следующую строку:
это будет держать консоль, пока вы не нажмете клавишу.
Если вы запускаете свой код из компетентной IDE, например Код::Блоки, IDE будет управлять консолью, которую он использует для запуска кода, сохраняя его открытым, когда приложение закрывается. Вы не хотите добавлять специальный код, чтобы держать консоль открытой, потому что это помешает ей работать правильно, когда вы используете ее для реального, вне IDE.
хорошо, я предполагаю, что вы находитесь в Windows, используя Visual Studio. почему? Ну, потому что если вы находитесь на какой-то ОС Linux, то вы, вероятно, будете запускать его с консоли.
в любом случае, вы можете добавить дерьмо в конец своей программы, как предлагают другие, или вы можете просто нажать сочетание клавиш Ctrl + клавишу F5 (запуск без отладки), и Visual Studio оставит консоль после завершения.
другой вариант, если вы хотите запустить отладочную версию и не добавить хрень ваш код, чтобы открыть окно консоли (Пуск -> Выполнить -> cmd) и перейдите в папку отладка выходной каталог. Затем просто введите имя исполняемого файла, и он запустит вашу отладочную программу в консоли. Затем вы можете использовать приложение Visual Studio для процесса или что-то еще, если вы действительно хотите.
Если вы действительно отлаживаете приложение в Visual C++, нажмите клавишу F5 или зеленый треугольник на панели инструментов. Если вы на самом деле не отлаживаете его (у вас нет установленных точек останова), нажмите Ctrl+F5 или выберите "пуск без отладки" в меню (обычно это меню отладки, которое, я согласен, сбивает с толку.) Это будет немного быстрее, и что более важно для вас, будет пауза в конце без необходимости изменения кода.
кроме того, откройте командную строку, перейдите в папка, где находится ваш exe, и запустите его, введя его имя. Таким образом, когда он закончит работу, командная строка не закроется, и вы сможете увидеть вывод. Я предпочитаю оба этих метода добавлению кода, который останавливает приложение так же, как и его завершение.
добавьте следующую строку в конце программы. Он попытается захватить некоторую форму пользовательского ввода, таким образом, он останавливает автоматическое закрытие консоли.
В то время как вы можете вызвать exit() (и, возможно, потребуется сделать это, если ваше приложение обнаружит фатальную ошибку ), самый чистый способ выхода из программы - это возврат из main() :
Когда вы вызываете exit() , объекты с автоматической продолжительностью хранения (локальные переменные) не уничтожаются до завершения программы, поэтому вы не не получить надлежащую очистку. Этим объектам может потребоваться очистить любые ресурсы, которыми они владеют, сохранить любые ожидающие изменения состояния, завершить все запущенные потоки или выполнить другие действия, чтобы программа завершала работу корректно.
Есть несколько способов заставить вашу программу завершиться. Какой из них подходит, зависит от того, почему вы хотите, чтобы ваша программа была прервана. В большинстве случаев это должно быть выполнением оператора return в вашей основной функции. Как и в следующем.
Как уже определили другие, это позволяет должным образом уничтожить все переменные вашего стека, чтобы очистить их должным образом. Это очень важно.
Если вы обнаружили ошибку где-то глубоко в вашем коде и вам нужно выйти, вы должны выдать исключение, чтобы вернуться к основной функции. Как и в следующем.
Это приводит к разматыванию стека и разрушению всех переменных вашего стека. Все еще очень важно. Обратите внимание, что уместно указывать сбой с ненулевым возвращаемым значением.
Если в маловероятном случае, когда ваша программа обнаружит условие, которое указывает на то, что больше не безопасно выполнять больше операторов, вам следует использовать std :: abort (). Это приведет к внезапной остановке вашей программы без дальнейшей обработки. std :: exit () похож, но может вызывать обработчики atexit, что может быть плохо, если ваша программа достаточно загружена.
Да! exit() . Он находится в <cstdlib> .
Если, однако, ваша программа находится в неисправимом состоянии, она должна выдать исключение. Однако важно осознавать последствия этого. Нет общепринятых лучших практик для принятия решения о том, что должно или не должно быть исключением, но есть некоторые общие правила, о которых вам необходимо знать.
Например, создание исключения из деструктора - почти всегда ужасная идея, потому что уничтожаемый объект мог быть уничтожен, потому что исключение уже было сгенерировано. Если выдается второе исключение, вызывается terminate , и ваша программа останавливается без дальнейшей очистки. Вы можете использовать uncaught_exception , чтобы определить, безопасно ли это, но обычно лучше не допускать, чтобы исключения выходили из деструктора.
Хотя обычно для функций, которые вы вызываете, но не пишете, всегда есть возможность генерировать исключения (например, new выбрасывает std::bad_alloc , если он не может выделить достаточно памяти), начинающим программистам часто бывает трудно отследить или даже узнать обо всех специальных правилах, окружающих исключения в C ++. По этой причине я рекомендую использовать их только в тех случаях, когда у вашей программы нет разумного способа продолжить выполнение.
exit является удержанием для C и может привести к тому, что объекты с автоматическим хранением не будут очищены должным образом. abort и terminate эффективно заставляют программу совершить самоубийство и определенно не очистит ресурсы.
Что бы вы ни делали, не используйте исключения, exit или abort / terminate как опора для написания правильно структурированной программы. Сохраните их для исключительных ситуаций.
если вы находитесь в основном, вы можете сделать:
Код выхода зависит от семантики вашего кода. 1 - ошибка 0, нормальный выход.
В последнее время я пытаюсь изучить С++ из этого веб-сайта. К сожалению, всякий раз, когда я пытаюсь запустить один из примеров кода, я вижу, что эта программа открыта примерно на полсекунды, а затем сразу же закрывается. Есть ли способ немедленно закрыть программу, чтобы я мог видеть плоды моих усилий?
ОТВЕТЫ
Ответ 1
Изменить: Как справедливо отмечает Чарльз Бейли в комментарии ниже, это не сработает, если в stdin есть символы, буферизированные, и на самом деле нет хорошего способа обойти это. Если вы используете прилагаемый отладчик, предлагаемое решение John Dibling, вероятно, является самым чистым решением вашей проблемы.
Тем не менее, я оставлю это здесь, и, возможно, кто-то найдет это полезным. Я часто использовал его в качестве быстрого взлома при написании тестов во время разработки.
В конце вашей функции main вы можете вызвать std::getchar();
Ответ 2
Если вы используете Visual Studio, и вы запускаете консольное приложение из среды IDE:
нажатие CTRL-F5 (запуск без отладки) запустит приложение и откроет окно консоли, пока вы не нажмете любую клавишу.
Ответ 3
Решение James работает для всех платформ.
В качестве альтернативы на Windows вы также можете добавить следующее перед возвратом из функции main :
Ответ 4
Если вы используете Microsoft Visual С++ 2010 Express и столкнулись с проблемой: CTRL + F5 не работает для того, чтобы консоль открылась после завершения программы, посмотрите этот поток MSDN.
Вероятно, ваша IDE настроена на закрытие консоли после запуска CTRL + F5; на самом деле, "пустой проект" в Visual С++ 2010 закрывает консоль по умолчанию. Чтобы изменить это, сделайте так, как предположил Microsoft-модератор:
Ответ 5
Обычно я просто устанавливаю точку останова на main() , закрывая фигурные скобки. Когда конец программы будет достигнут любым способом, на который ударит точка останова, и вы можете ALT-Tab в окне консоли, чтобы просмотреть результат.
Ответ 6
Почему бы не просто запустить программу с консоли, а запустить программу из cmd.exe, если вы используете Windows. Таким образом, окно остается открытым после завершения программы.
[EDIT]: Когда я использую KDevelop4, на вкладке внизу среды IDE имеется полностью установленный экземпляр Bash (CLI Linux). Это то, что я использую в таких обстоятельствах.
Ответ 7
До конца кода вставьте эту строку:
Это будет держать консоль до тех пор, пока вы не нажмете клавишу.
Ответ 8
Вызвать cin.get(); 2 раза:
Ответ 9
Если вы запустите свой код из компетентной среды разработки, например Code:: Blocks, среда IDE будет управлять консолью, которую она использует для запуска код, сохраняя его открытым, когда приложение закрывается. Вы не хотите добавлять специальный код, чтобы консоль открывалась, потому что это предотвратит его правильное функционирование, если вы используете его на самом деле, вне среды IDE.
Ответ 10
Если вы действительно отлаживаете свое приложение в Visual С++, нажмите F5 или зеленый треугольник на панели инструментов. Если вы на самом деле не отлаживаете его (у вас нет установленных точек останова), нажмите Ctrl + F5 или выберите "Начать без отладки" в меню (обычно это в меню "Отладка", которое, я согласен, сбивает с толку.) Это будет немного быстрее, и что более важно для вас, остановится в конце, если вам не придется менять свой код.
В качестве альтернативы откройте командную строку, перейдите в папку, в которой находится ваш exe, и запустите ее, набрав ее имя. Таким образом, когда он закончил выполнение командной строки, она не закрывается, и вы можете увидеть результат. Я предпочитаю оба этих метода добавлять код, который останавливает приложение так же, как и его завершение.
Ответ 11
Хорошо, я предполагаю, что вы работаете в Windows с помощью Visual Studio. почему? Хорошо, потому что если вы находитесь на какой-то ОС Linux, вы, вероятно, будете запускать ее с консоли.
В любом случае вы можете добавить crap в конец вашей программы, как предлагают другие, или просто нажать CTRL + F5 (начать без отладки), а Visual Studio покинет консоль до завершения.
Ответ 12
Добавьте следующие строки перед любой функцией exit() или перед любым return в main() :
Ответ 13
Просто добавьте следующее в конце своей программы. Он попытается зафиксировать некоторую форму ввода пользователя, таким образом, он не позволит автоматически закрывать консоль.
Ответ 14
Для Visual Studio (и только Visual Studio) следующий фрагмент кода дает вам приглашение "дождаться нажатия клавиши для продолжения", которое действительно ждет, когда пользователь будет явно нажимать новый ключ, сначала очистив входной буфер:
Обратите внимание, что для этого используется макрос tchar.h для совместимости с несколькими "наборами символов" (как их называет VС++).
Ответ 15
Ответ 16
Ответ 17
Посмотрите, есть ли у вашей IDE флажок в настройке проекта, чтобы окно оставалось открытым после завершения программы. Если нет, используйте std::cin.get(); для чтения символа в конце основной функции. Однако не забудьте использовать только линейный вход (std:: getline) или обрабатывать оставшиеся непрочитанные символы в противном случае (std:: ignore до новой строки), потому что иначе конец .get() будет читать только выведенный мусор непрочитанных ранее.
Ответ 18
Вы даже можете объявить целое число в начале вашей функции main() (скажем int a; ) и поместить std::cin >> a; непосредственно перед возвращаемым значением. Таким образом, программа будет работать до тех пор, пока вы не нажмете клавишу и не войдете.
Ответ 19
Это работает хорошо:
Если вы сначала очистите буфер, это не будет проблемой при чтении следующего. По какой-то причине cin.ignore(1) не работает, оно должно быть 2.
Ответ 20
Все, что вам нужно сделать, установите переменную для x, затем просто введите это перед возвратом 0;
Ответ 21
Вы всегда можете создать пакетный файл. Например, если ваша программа называется helloworld.exe, некоторый код будет:
Ответ 22
Я помещаю точку останова при последнем возврате 0 программы. Он отлично работает.
Ответ 23
Ответ 24
Я использовал cin.get() , и это сработало, но в один прекрасный день мне нужно было использовать еще один cin.get([Array Variable]) до этого, чтобы захватить строку строки с пустым символом в середине. поэтому cin.get() не закрыл окно командной строки. Наконец, я нашел другой способ: Нажмите CTRL + F5, чтобы открыть его во внешнем окне, а Visual Studio больше не контролирует его. Просто спросите вас о закрытии после запуска последних команд.
Ответ 25
Я просто делаю это:
Примечание: очистка буфера cin и это необходимо только в том случае, если вы использовали cin в какой-то момент раньше в вашей программе. Кроме того, использование std:: numeric_limits:: max(), вероятно, лучше, чем INT_MAX, но оно немного многословно и обычно не нужно.
Ответ 26
Я попытался добавить функцию getchar() в конец. Но это не сработало. Так что я сделал, добавлял две функции getchar() один за другим. Я думаю, что первый getchar() поглощает клавишу Enter , которую вы нажимаете после последнего ввода данных. Поэтому попробуйте добавить две функции getchar() вместо одной
Ответ 27
Аналогичная идея для ответа yeh, минимальная альтернатива.
Создайте пакетный файл со следующим содержимым:
Затем используйте командный файл.
Ответ 28
Я не заметил, что кто-то еще разместил это, так что вот оно.
Ответ 29
просто используйте cin.ignore() прямо перед возвратом 0; дважды
Ответ 30
Если вы используете Windows, вы можете сделать system("pause >nul"); или system("pause"); . Он запускает консольную команду для приостановки программы, пока вы не нажмете клавишу. >nul препятствует тому, чтобы он говорил Press any key to continue. .
Я пытался, Application.Exit но он по-прежнему вызывает все дочерние окна и оповещения, и я не знаю, как использовать Environment.Exit и какое целое число вставить в него.
Кстати, всякий раз, когда мои формы вызывают событие formclosed или, form closing я закрываю приложение с помощью this.Hide() функции; Влияет ли это на поведение моего приложения сейчас?
То есть вы говорите, что скрываете только формы, а не закрываете их? Это, вероятно, причина, по которой приложение не закрывается, оно все еще имеет открытые (скрытые) формы. Тогда я должен заменить все это.Скрыть () на это. Закрыть ()? Разместите код, касающийся действий и событий Close.Завершает этот процесс и дает базовой операционной системе указанный код выхода. Это код для вызова, когда вы используете консольное приложение.
Эта статья, Application.Exit vs. Environment.Exit , указывает на хороший совет:
В вопросе не упоминалось завершение из-за ошибки, поэтому код выхода должен быть нулевым: Environment.Exit(0) любое ненулевое значение подразумевает код ошибки конкретного приложения, который может использоваться сценарием для выполнения соответствующих действий. (Это новый код и приложение WinForms, так что в этом случае это вряд ли имеет значение, но это полезно знать всем, кто пишет инструменты командной строки.) Environment.Exit можно использовать и для применения форм. Поправьте меня, если я ошибаюсь, но я думаю, что return заявление впоследствии улучшит этот подход. Как я понял код будет продолжать выполнение после Application.Exit() до в return заявлении.Я знаю, что это не та проблема, с которой вы столкнулись, однако еще одна причина, по которой это может произойти, заключается в том, что в вашем приложении открыт не фоновый поток.
Когда IsBackground это false будет держать вашу программу открыты до резьбы Завершает, если вы установите IsBackground на true резьбу не будет держать программу открытой. Такие вещи, как BackgroundWoker , ThreadPool и Task все внутренне используют поток с IsBackground установленным на true .
Все, что тебе нужно System.Environment.Exit(1);
И он использует системное пространство имен «using System», которое почти всегда присутствует при запуске проекта.
Его больше подходит только для консольных приложений. Следует отметить, что события FormClosing / FormClosed не будут вызываться для Environment.Exit, а также exitCode должен быть ненулевым, если произошла ошибка,Я бы выбрал одно из следующих:
для консольного приложения (работает также на winforms).
Environment.Exit (0) также работает для WinForms, существует приложение без каких-либо исключений.Кстати. всякий раз, когда мои формы вызывают событие formclosed или закрытия формы, я закрываю приложение с помощью функции this.Hide (). Влияет ли это на поведение моего приложения сейчас?
Если все ваше приложение всегда должно полностью завершаться всякий раз, когда ваша основная форма закрыта, вам следует просто удалить этот обработчик закрытой формы. Не отменяя это событие и просто позволяя им закрыться, когда пользователь закроет его, вы получите желаемое поведение. Что касается всех других форм, если вы не собираетесь снова показывать тот же экземпляр формы, вы просто позволяете им закрыться, вместо того, чтобы предотвращать закрытие и скрывать их. Если вы показываете их снова, то их можно скрыть.
Если вы хотите, чтобы пользователь мог щелкнуть «x» для основной формы, но оставить другую форму открытой и, по сути, стать «новой» основной формой, то это немного сложнее. В таком случае вам нужно будет просто скрыть свою основную форму, а не закрывать ее, но вам нужно будет добавить какой-то механизм, который фактически закроет основную форму, когда вы действительно хотите, чтобы ваше приложение заканчивалось. Если вы находитесь в такой ситуации, вам нужно добавить больше вопросов к вашему вопросу, описывающих, какие типы приложений должны и не должны завершать программу.
Читайте также: