exit(1) в C++

В этой статье объясняется, как использовать функцию exit() в C++.
Используйте функцию exit для завершения программы C++ с кодом состояния
Запущенную программу обычно называют процессом в операционной системе, и у нее есть свой жизненный цикл, который представлен в виде различных состояний. Существуют давно работающие программы, такие как веб-серверы, но даже они должны быть остановлены при некоторых обстоятельствах или путем доставки сигнала пользователя. Завершение процесса можно вызвать с помощью функции exit() , которая является частью стандарта C и включена в C++. Он принимает один целочисленный аргумент, указывающий статус завершения программы, который может быть прочитан из родительского процесса, если дочерний процесс ожидает.
Обычное значение кода статуса успешного возврата — 0 , и все, кроме нуля, считается кодом ошибки, который может соответствовать заранее определенному сценарию. Обратите внимание, что есть два макро-выражения, называемые EXIT_SUCCESS и EXIT_FAILURE для обозначения соответствующих кодов выхода, переданных вызову exit . Как правило, программа имеет несколько файловых потоков и открытых временных файлов, которые закрываются или удаляются автоматически при вызове exit .
Используйте exit(1) для завершения программы C++ с кодом состояния сбоя
Функция exit со значением аргумента 1 используется для обозначения завершения с ошибкой. Некоторые функции, возвращающие значение кода состояния успешного вызова, могут быть объединены с условным оператором, который проверяет возвращаемое значение и выходит из программы в случае возникновения ошибки. Обратите внимание, что exit(1) аналогичен вызову exit(EXIT_FAILURE) .
Операторы break и continue в C++

Оператор break в C++
С оператором break вы уже встречались, если читали наши статьи об операторе switch и о цикле for. И наверняка уже имеете представление о том, как он работает. Поговорим еще немного об этом операторе, возможно кому-то будет полезно.
Достаточно часто при использовании циклов и почти всегда при использовании оператора switch , программисту необходимо прервать выполнение тела цикла или тела switch соответственно. break , как раз используется в таких случаях.
Так же, с помощью этого оператора прерывается бесконечный цикл. Когда его нужно прервать, в тело цикла добавляется условие, при выполнении которого сработает оператор break , а цикл завершит работу. В следующем примере, реализована простая игра: один игрок загадывает число от 1 до 7, второй должен отгадать его.
Чтобы всё было честно и игрок, который загадывает, не мог ввести число из недопустимого диапазона, запускаем бесконечный цикл в котором и происходят ввод и проверка числа. Если число соответствует необходимому диапазону – цикл прерывается (строки 15 – 18), если же нет – на экране появляется предупреждение и предложение ввести число снова. Так будет происходить, пока введенное число не войдет в нужный диапазон.
После ввода корректного числа, в строке 25 вызываем специальную функцию system(“cls”); , которая очистит содержимое экрана, перед тем, как второй игрок приступит к отгадыванию числа (сработает только в windows).
Далее определяем второй бесконечный цикл (строки 29 – 47), но уже со счетчиком myTry . Он будет считать количество попыток игрока отгадать число. Игрок вводит число и оно сразу проверяется на соответствие диапазону в строках 33 – 37.
Если не соответствует – предупреждаем и отнимаем единицу от счетчика попыток myTry . Иначе если число в нужный диапазон вошло, проверяем соответствует ли оно загаданному числу (строки 38 – 42): да – поздравляем и прерываем цикл, нет – переходим к выполнению строк 43 – 46 – говорим об ошибке и предлагаем ввести число снова.


Оператор continue в C++
Этот оператор применяется тогда, когда необходимо прервать (пропустить) текущую итерацию цикла и приступить к следующей итерации. При его выполнении в цикле for происходит остановка текущей итерации, переход к изменению управляющей переменной, а затем проверка условия продолжения выполнения цикла.
Решим такую задачу: Необходимо вывести на экран те числа, которые делятся на 7 без остатка и находятся в диапазоне от 1 до 70 .
Прерывание выполнения программы в C
У меня запущен цикл, который увеличивает значение переменной на каждой итерации, и я хочу иметь возможность нажать клавишу на клавиатуре, чтобы остановить цикл и сообщить окончательное значение переменной. Дело в том, что я не могу понять, как это сделать в C. Я чувствую себя глупо, потому что кажется, что я упускаю из виду какой-то действительно простой и легкий способ сделать это, но все, что я пытаюсь сделать, останавливает цикл до Я нажимаю клавишу на клавиатуре, а это, по сути, полная противоположность тому, что я хочу.
По сути, я хочу сделать что-то вроде этого:
Имеет ли это смысл? В любом случае, есть какие-нибудь советы о том, как это сделать на C?
задан 31 июля ’09, 20:07
Это домашнее задание (мне кажется, оно похоже на домашнее)? — stanigator
Кроме того, ваша реализация зависит от платформы, поскольку обнаружение нажатия клавиши происходит из вызовов функций, специфичных для ОС. Было бы здорово, если бы вы могли указать, для какой операционной системы вы разрабатываете. — stanigator
10 ответы
Если вы пытаетесь прочитать один символ за раз (без нажатия Enter) с терминала в Linux, вам нужно будет настроить терминал на небуферизованный ввод.
ответ дан 01 авг.
Если вам разрешено указывать, что нажимается, и вы находитесь в системе, совместимой с POSIX.1, вы можете настроить обработчик сигнала для перехвата SIGINT (отправляемого с помощью Ctrl + C). Пусть ваш обработчик изменит значение переменной так, чтобы вы выпали из цикла while.
Если вы выберете этот подход, будьте осторожны. Если неправильная реализация приводит к бесконечному циклу и перехваченному SIGINT, вы не сможете завершить свою программу с помощью Ctrl + C. В этом случае вам нужно будет использовать kill (1) для завершения вашей программы.
ответ дан 01 авг.
Если вы работаете с окнами и используете MSVC, вам могут понадобиться getch () и kbhit (), что-то вроде этого
ответ дан 01 авг.
Это зависит от вашей платформы. В языке C такие вещи не определяются.
Windows? Linux? (приложение gnome? приложение kde? терминал?) что-то еще?
ответ дан 01 авг.
Это то место, где стандарт C заставляет программистов бездельничать. Наиболее переносимым решением этой проблемы является выполнение операций ввода-вывода с помощью что собой представляет curses библиотека, который обрабатывает так называемый «сырой» ввод с клавиатуры (что вам и нужно), а также многое другое. Кривая обучения немного крутая, но есть хорошие руководства, особенно в документации для программистов BSD.
ответ дан 01 авг.
Функция, которую вы вызываете для чтения символа, блокируется. Если там нет символа, вы хотите, чтобы он вернулся.
Ключевые слова волшебного поиска здесь — это неблокирующий и небуферный ввод.
ответ дан 01 авг.
Почему подсчет в цикле до тех пор, пока кто-нибудь не нажмет клавишу, имеет смысл?
Если вам действительно нужно что-то вроде, проверьте тайминги на 10 тысяч итераций. Затем сделайте ожидание в неблокирующей итерации whit sleep (). Когда вы получите время, вы можете использовать его, чтобы приблизительно определить «окончательное значение».
ответ дан 01 авг.
В зависимости от системы и того, как она работает, вы можете попробовать использовать функцию select с STDIN в качестве дескриптора файла. Вы можете установить время в операторе select равным нулю, чтобы узнать, есть ли данные, или установить время ожидания.
Вы можете посмотреть ссылку http://www.gnu.org/s/libc/manual/html_node/Waiting-for-I_002fO.html для примера использования оператора select с сокетами.
Я изменил этот пример, чтобы использовать STDIN в качестве дескриптора файла. Функция вернет 0, если нет ожидающего ввода, 1, если есть ожидающий ввод (т.е. кто-то нажал клавишу на клавиатуре ввода), или -1, если произошла ошибка некоторого характера.
Я знаю, что это не будет работать в системе VMS, поскольку я пробовал это, и они реализовали Select и STDIN по-разному, поэтому это не сработало (пришлось использовать другие средства для обнаружения ввода с клавиатуры).
Для Visual C / C ++ можно использовать функцию kbhit, которая укажет, есть ли ввод с клавиатуры для чтения.
ответ дан 01 авг.
Я постараюсь смотреть не на дословный вопрос, который вы задаете, а на ваше намерение — очевидно, вы хотите представить результат вычислений, вызванный какой-либо реакцией пользователя.
Проверка «нажата ли клавиша?» на каждой итерации довольно расточительно — ваш процессор мог бы все это время тратить на более полезные дела.
Итак, на мой взгляд, лучший подход здесь — это использование сигналов, а именно SIGINT, который срабатывает, когда вы нажимаете Ctrl-C. Вот код, который распечатает значение переменной, когда вы нажмете Ctrl-C, и выйдет после того, как вы сделаете это три раза:
Вы можете передавать сигналы между программами, так что на самом деле вы можете форкнуть программу, которая выполняет «работу», и тогда вторая программа будет лениво контролировать клавиатуру — и как только там будет нажата клавиша, она отправит сигнал на первый, который напечатает результат.
ответ дан 01 авг.
Некоторые люди упомянули о блокировке. В средах * nix вы можете попробовать установить дескриптор стандартного входного файла в неблокирующий режим. Вот пример:
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c keyboard program-flow or задайте свой вопрос.
Урок №70. Операторы break и continue
Хотя вы уже видели оператор break в связке с оператором switch, все же он заслуживает большего внимания, поскольку может использоваться и с циклами. Оператор break приводит к завершению выполнения циклов do, for или while.
break и switch
В контексте оператора switch оператор break обычно используется в конце каждого кейса для его завершения (предотвращая fall-through):
break и циклы
В контексте циклов оператор break используется для завершения работы цикла раньше времени:
Эта программа позволяет пользователю ввести до 10 чисел и в конце подсчитывает их сумму. Если пользователь введет 0 , то выполнится break и цикл завершится (не важно, сколько чисел в этот момент успел ввести пользователь).
Обратите внимание, оператор break может использоваться и для выхода из бесконечного цикла:
break и return
Новички часто путают или не понимают разницы между операторами break и return. Оператор break завершает работу switch или цикла, а выполнение кода продолжается с первого стейтмента, который находится сразу же после этого switch или цикла. Оператор return завершает выполнение всей функции, в которой находится цикл, а выполнение продолжается в точке после вызова функции:
Оператор continue
Оператор continue позволяет сразу перейти в конец тела цикла, пропуская весь код, который находится под ним. Это полезно в тех случаях, когда мы хотим завершить текущую итерацию раньше времени. Например:
Эта программа выведет все числа от 0 до 19, которые не делятся нацело на 4.
В случае с циклом for часть инкремента/декремента счетчика по-прежнему выполняется даже после выполнения continue (так как инкремент/декремент происходит вне тела цикла).
Будьте осторожны при использовании оператора continue с циклами while или do while. Поскольку в этих циклах инкремент счетчиков выполняется непосредственно в теле цикла, то использование continue может привести к тому, что цикл станет бесконечным! Например:
Предполагается, что программа выведет все числа от 0 до 9, за исключением 5. Но на самом деле:
А затем цикл станет бесконечным. Когда значением count становится 5 , то условие оператора if станет true, затем выполнится continue и мы, минуя вывод числа и инкремент счетчика, перейдем к следующей итерации. Переменная count так и не увеличится. Как результат, в следующей итерации переменная count по-прежнему останется со значением 5 , а оператор if по-прежнему останется true, и цикл станет бесконечным.