C как завершить консольное приложение
В последнее время я пытаюсь изучить С++ из этого веб-сайта. К сожалению, всякий раз, когда я пытаюсь запустить один из примеров кода, я вижу, что эта программа открыта примерно на полсекунды, а затем сразу же закрывается. Есть ли способ немедленно закрыть программу, чтобы я мог видеть плоды моих усилий?
ОТВЕТЫ
Ответ 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. .
exit Функция, объявленная в <stdlib.h> , завершает программу на C++. Значение, передаваемое в качестве аргумента, exit возвращается операционной системе в качестве кода возврата программы или кода выхода. Принято, чтобы нулевым кодом возврата обозначалось, что программа завершена успешно. Константы EXIT_FAILURE и EXIT_SUCCESS , также определенные в, можно использовать <stdlib.h> для обозначения успеха или неудачи программы.
Выдача return инструкции из main функции эквивалентна вызову exit функции с возвращаемым значением в качестве аргумента.
Функция abort
abort Функция, также объявленная в стандартном включаемом файле <stdlib.h> , завершает программу на C++. Разница между exit и заключается в том abort , что exit позволяет выполнять обработку завершения при завершении выполнения C++ (вызываются деструкторы глобальных объектов), но abort немедленно завершает программу. abort Функция обходит обычный процесс уничтожения инициализированных глобальных статических объектов. Он также обходит любую специальную обработку, указанную с помощью atexit функции.
Функция atexit
Используйте atexit функцию, чтобы указать действия, которые выполняются до завершения программы. Глобальные статические объекты, инициализированные до уничтожения вызова atexit , не будут уничтожены до выполнения функции выхода.
return в main
Выдача return инструкции из main функционально эквивалентна вызову exit функции. Рассмотрим следующий пример.
exit Операторы и return в предыдущем примере функционально идентичны. Как правило, для C++ требуются функции, которые возвращают типы, отличные от void возвращаемых значений. main Функция является исключением; она может завершаться без return оператора. В этом случае он возвращает зависящее от реализации значение для вызывающего процесса. return Оператор позволяет указать возвращаемое значение из main .
Уничтожение статических объектов
При вызове exit или выполнении return инструкции из main статические объекты уничтожаются в обратном порядке их инициализации (после вызова метода, atexit если он существует). В следующем примере показано выполнение такого процесса инициализации и удаления.
Пример
В следующем примере статические объекты sd1 и sd2 создаются и инициализируются перед записью в main . После завершения выполнения этой программы с помощью return инструкции сначала sd2 уничтожается, а затем sd1 . Деструктор класса ShowData закрывает файлы, связанные с этими статическими объектами.
Другой способ записать этот код — объявить объекты ShowData с областью видимости блока, в результате чего они будут удаляться при выходе из области.
В то время как вы можете вызвать 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, нормальный выход.
Прежде чем вы начнете тратить на меня свое время, имейте в виду, что этот вопрос больше касается вопроса о том, достаточно ли законно это отключение.
Я прочитал все виды способов закрыть программу. Я ЗНАЮ, что всегда лучше закрыть программу, в конце! Итак, как я уже сказал, я читал все виды тем, но я не мог найти ту, которую я правильно понял. Так что я вроде придумал свой путь. Я просто хочу убедиться, что это хороший метод.
Поэтому я хочу, чтобы вы сосредоточились на цикле while. Это мой метод.
И это моя командная функция. Как вы видите, это меняет «ход» на 0 (или ложь). Я надеюсь, что сделал это достаточно понятным.
РЕДАКТИРОВАТЬ: Все, что я хочу знать, если это хороший метод 🙂
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Хорошо! Я изменил «выход (0);» «вернуть (0);». Так что я думаю, что это хороший метод! Спасибо за вашу помощь! 🙂
Решение
С помощью exit() в программе легально. Хотя это вообще плохая идея. Но если программа застряла без возврата по какой-то странной причине, вы можете это сделать.
С помощью exit в main() это грубо: я просто не могу думать о здравом рассудке, чтобы не использовать взамен взамен.
Разница между выходом () и возвратом из основного состоит в том, что первый оставит все локальные объекты в кадрах стека от основного до зависания точки вызова, деструктор не вызывается. Только статические / глобальные объекты получают правильное отключение. Это может удивить некоторые части кода и оставить важные вещи не выполненными.
Поскольку в C ++ есть прекрасные исключения, я бы посчитал предпочтительным заменить exit () на бросание чего-то, что справляется с main, где происходит регулярный возврат.
Другие решения
if (running == 0) но бессмысленно!
Учитывая граничные условия в вопросе, exit () делает то, что вы хотите. Он обычно завершает процесс, выполняя обычную очистку для завершающих программ (atexit (), уничтожая объекты без автоматического хранения и т. Д.).
Вы на самом деле не хотите использовать глобальный запуск, поэтому я бы предпочел проверить параметр return command ().
На моем компьютере каждый день запускается множество консольных программ, поэтому управление работой этих программ становится проблемой. Другими словами, вы также можете рассмотреть возможность запуска консольной программы для выполнения определенных задач.
Содержание этой статьи
Используйте Ctrl + C, чтобы завершить консольную программу
Если вы используете его напрямую Process.Kill Убейте процесс, процесс может не успеть сохранить данные. Поэтому, будь то оконная программа или консольная программа, лучше всего позволить консольной программе закрыться сама по себе.
▲ Используйте Process.Kill Завершите программу, код выхода - -1.
▲ Используйте Ctrl+C Завершите программу, код выхода из программы - 0
Ctrl + C сигнал
API Windows предоставляет способ связать текущий процесс с процессом целевой консоли, чтобы мы могли отправлять себе Ctrl+C Сигнал о завершении другого связанного с ним консольного процесса.
Методами ассоциирования и разъединения являются следующие два: AttachConsole с участием FreeConsole :
Однако при отправке Ctrl+C Когда поступает сигнал, выйдет не только консольная программа, которую мы хотим закрыть, но и наша собственная программа (даже если мы сами являемся программой с графическим интерфейсом). Поэтому мы должны организовать себя, чтобы ответить Ctrl+C сигнал.
Необходимо использовать другой API:
Однако, поскольку на самом деле нам не нужно Ctrl+C Чтобы ответить, просто временно отключите следующее, поэтому мы передаем этому делегату null Достаточно.
Ниже я выложу полный код.
Полный исходный код
как пользоваться
Теперь мы можем позвонить ConsoleInterop.StopConsoleProgram(process) Чтобы безопасно завершить консольную программу.
Ссылка
Если вы видите в блоге что-то, чего не понимаете, сообщите об этом. я построилдотнет профессионально-технический колледж Приглашаем всех присоединиться.
Интеллектуальная рекомендация
Краткое описание общих функций MPI
содержание 1, основная функция MPI 2, точка-точка функция связи 3, коллективная функция связи 1, основная функция MPI MPI_Init(&argc, &argv) Информировать системы MPI для выполнения всех необх.
Примечание 9: EL выражение
JVM память
концепция Виртуальная машина JVM управляет собственной памятью, которая разделяет память во многие блоки, наиболее распространенной для памяти стека и памяти кучи. 1 структура виртуальной машины JVM H.
Проблема сетевого запроса на Android 9.0
вЗапустите Android 9 (API Уровень 28) или вышеНа устройстве операционной системы Android, чтобы обеспечить безопасность пользовательских данных и устройств, использование по умолчанию для зашифрованно.
Учебная запись по Webpack (3) В статье рассказывается о создании webpack4.0.
предисловие Для изучения веб-пакета автор также предпринял много обходных путей. Есть много вещей, которые я хочу знать, но я не могу их найти. Автор поможет вам быстро начать работу. Цель этой статьи.
Читайте также: