How to pause in C?
I am a beginner of C. I run the C program, but the window closes too fast before I can see anything. How can I pause the window?
11 Answers 11
before the return from the main function. That will wait for a character input before exiting the program.
Alternatively you could run your program from a command line and the output would be visible.
If you want to just delay the closing of the window without having to actually press a button ( getchar() method), you can simply use the sleep() method; it takes the amount of seconds you want to sleep as an argument.
Is it a console program, running in Windows? If so, run it from a console you’ve already opened. i.e. run «cmd», then change to your directory that has the .exe in it (using the cd command), then type in the exe name. Your console window will stay open.
Under POSIX systems, the best solution seems to use:
If the process receives a signal whose effect is to terminate it (typically by typing Ctrl + C in the terminal), then pause will not return and the process will effectively be terminated by this signal. A more advanced usage is to use a signal-catching function, called when the corresponding signal is received, after which pause returns, resuming the process.
Note: using getchar() will not work is the standard input is redirected; hence this more general solution.
Пауза консоли в C++
Какие функции в Visual Studio (помимо system(«pause»); ) останавливают закрытие консоли.
1 ответ 1
Если речь идет только о работе в IDE, для приостановки работы программы можно использовать обычные точки останова и отладчик, какие-то специальные вызовы в коде не нужны. Более того, использование вызовов типа system(«pause») приведет к тому, что программу невозможно будет нормально вызывать из пакетных файлов: она будет каждый раз ждать ввода с реальной консоли, даже если стандартный ввод перенаправлен из файла и ожидалась работа без участия пользователя. Но, если все же действительно нужно приостановить консоль при любом запуске программы, есть несколько вариантов:
- Отображает приглашение ввода («Нажмите любую клавишу»)
- Прерывает работу программы до нажатия любой клавиши
- Работает только под Windows (в других ОС нет команды PAUSE)
- Внутренне вызывает командный интерпретатор, поэтому считается «тяжелым» вариантом (если производительность что-то значит в данном случае)
Есть миф, что такой вызов небезопасен, так как если поместить в папку с программой вредоносный файл pause.exe, он будет вызван вместо команды PAUSE. Это не так в современных версиях Windows.
То же самое, но не отображает приглашение ввода.
- Не отображает приглашение ввода
- Прерывает работу программы до нажатия клавиши Enter
- Стандартная функция — работает в любом окружении
В отличие от других вариантов, не ломает перенаправление стандартного ввода (достаточно поместить на вход строку любого содержания, и выполнение программы пойдет дальше).
- Не отображает приглашение ввода
- Прерывает работу программы до нажатия любой клавиши
- Нестандартная функция, доступна в DOS и Windows (в других ОС есть похожие аналоги)
Опять же, существует миф, что в Windows это какой-то DOSовский вызов и использовать его — дикий криминал. На самом деле, внутренне он реализуется как обычный вызов WINAPI-функции ReadConsoleInput, с предварительным отключением у консоли режима ENABLE_LINE_INPUT. Убедиться в этом можно, заглянув в исходники отладочной версии CRT, которые с некоторого времени частично открыты.
Использование system(“pause”)
Существует проблема, которую не могу уже решить дня 2 минимум. Чем объявлять system(«pause») в C++? Пробовал и , и , и , весь гугл обшарил, даже на getchar() пробовал заменить system , но после отладки проги консоль в упор закрывается 🙁
10 ответов 10
Внимание! Правильный ответ на вопрос был уже дан пользователем Андрей: функция system объявлена в заголовочном файле cstdlib (или stdlib.h ). Пожалуйста, не добавляйте новых ответов вида «я подключил N и все заработало«, где N — очередной заголовок, косвенно включающий cstdlib.
В Microsoft Visual Studio , например, при запуске по Ctrl-F5 , IDE сама будет запускать программу, как будто бы в ней ожидается ввод в конце.
Еще варианты решения:
- MS-овская функция _getch() из
- std::cin >> c , где c — это char c . Правда, придется нажимать еще и enter .
- Breakpoint на закрывающей скобке int main(. ) < >.
- Можно еще что-нибудь придумать.
Прекратите заниматься ерундой с вписыванием в код каких-то system(«pause») и прочего мусора. Ничего подобного в консольном приложении быть не должно.
Если вы занимаетесь разработкой консольного приложения под MS Visual Studio, то идите в настройки проекта, раздел Linker и установите настройку SubSystem в значение CONSOLE
После чего возьмите в привычку запускать свое приложение не в отладочном режиме («Start Debugging», F5), а в режиме «без отладчика» («Start Without Debugging», Ctrl+F5). Консольное окно в таком случае не будет закрываться само, а будет оставаться на экране до следующего нажатия клавиши.
Запуск же программ под отладчиком (F5) предназначен для ситуаций, когда у вас в коде есть точки останова, т.е. при запуске под отладчиком вас проблема автоматического закрытия окна волновать не должна вообще.
В VS2017, начиная с определенной версии, появилась опция отладчика, которая предотвращает закрытие консольного окна по завершении программы, независимо от того, запускали ли вы вашу программу в режиме отладки
Консоль паузы в программе C ++
Какой лучший способ приостановить консоль в программах на C ++?
- с помощью cin.get()
- или используя system(«pause»)
- или используя функции C, такие как getch() или же getchar() ?
Правда ли, что использование system(«pause») приводит к непереносимому коду и не может работать в UNIX?
Является ли cin.get () лучше использовать для приостановки консоли?
Решение
Там может быть лучший способ (например, использование портативного cin.get() ), но хорошо путь не существует. Программа, которая выполнила свою работу, должна выйти и вернуть свои ресурсы компьютеру.
И да, любое использование system() приводит к непереносимому коду, так как параметр передается оболочке, которой принадлежит ваш процесс.
Наличие пауз-кода в вашем исходном коде рано или поздно вызывает неприятности:
- кто-то забывает удалить код приостановки перед регистрацией
- теперь все работающие товарищи должны задаться вопросом, почему приложение больше не закрывается
- История версий испорчена
- #define это ад
- это раздражает любого, кто запускает ваш код из консоли
- это очень, очень, очень раздражает, когда вы пытаетесь запустить и завершить вашу программу из скрипта; раздражает, если ваша программа является частью конвейера в оболочке, потому что, если программа не заканчивается, сценарий оболочки или конвейер тоже не будут
Вместо этого изучите свою IDE. Вероятно, есть возможность не закрывать окно консоли после запуска. Если нет, то вам, как разработчику, стоит оправдать себя за то, что у вас всегда есть открытое окно консоли.
Кроме того, вы можете сделать это опцией программы, но я лично никогда не видел программу с опцией —keep-alive-when-dead ,
Мораль истории: Это проблема пользователя, а не проблема программы. Не портите свой код.
Другие решения
Если вы хотите написать переносимый код на C ++, я бы предложил использовать cin.get() ,
system(«PAUSE») работает в Windows, так как требует выполнения консольной команды с именем « PAUSE «Но я не уверен, что другие операционные системы, такие как Linux или другие производные Unix, поддерживают это. Так что это, как правило, непереносимо.
Так как C ++ уже предлагает cin.get() Я не вижу веской причины использовать C getch() ,
Какой лучший способ приостановить консоль в программах на C ++?
system(«pause»); а также getch(); (который происходит из мира DOS, IIRC) оба непереносимы.
Является ли cin.get () лучше использовать для приостановки консоли?
Как единственный портативный а также стандарт вариант, я бы сказал, что это так, но я лично считаю, что не следует писать интерактивные консольные программы, то есть программы, которые фактически приостанавливают консоль или запрашивают ввод (если нет действительно хорошая причина для этого, потому что это делает сценарии оболочки намного сложнее). Консольные программы должны взаимодействовать с пользователем через аргументы командной строки (или, по крайней мере, такой тип взаимодействия должен быть по умолчанию).
На всякий случай, если вам нужно приостановить программу для моей программы, которая запускается из IDE, и немедленно закрывается, но мне не хватает времени, чтобы увидеть, причина результата — не делай этого. Просто настройте свою IDE или запустите приставка программы прямо из консоли.
лучший способ во многом зависит от целевой платформы (платформ), использования отладки или выпуска и т. д.
Я не думаю, что есть один Лучший но для «принудительного» ожидания сценария ввода типа достаточно общим способом, особенно при отладке (обычно это компилируется или выводится на основе NDEBUG или же _DEBUG ), вы можете попробовать std::getline следующее
С нашей без «введите, чтобы продолжить», по мере необходимости.
Здесь нет хорошо способ сделать это, но вы должны использовать портативное решение, поэтому избегайте system() звонки, в вашем случае вы могли бы использовать cin.get() или же getch() как вы упомянули в своем вопросе, также есть один совет. Делать все паузы, контролируемые одним (или очень немногими) определениями препроцессора.
Где-то в глобальном файле:
Это не универсальный совет, но вы должны защитить себя от паузы в сборках релиза, и они должны иметь простое управление, мой упомянутый глобальный файл не может быть настолько глобальным, потому что изменения в нем могут привести к очень долгой компиляции.
Я просто хочу добавить, что есть способ получить то, что вы хотите, но для этого потребуется использовать какую-нибудь стороннюю библиотеку (или что вы сами пишете код, зависящий от платформы).
Насколько мне известно, самым большим недостатком cin является то, что вы должны нажать Return, а не только клавишу.
Предполагая, что у вас есть слушатель клавиш, вы можете довольно легко написать функцию, которая ждет, когда пользователь нажмет любой ключ. Однако поиск независимого от платформы слушателя ключей не является тривиальной задачей и, скорее всего, потребует загрузки частей более крупной библиотеки.
Я думаю о чем-то вроде:
Фактическая функция, очевидно, будет сильно отличаться от того, что я написал, в зависимости от используемой вами библиотеки.
Я знаю, что в следующих библиотеках есть списки ключей (не стесняйтесь добавлять больше в редактирование, если вы знаете что-либо.):
Я всегда использовал пару строк кода, которые очищают входной поток от любых символов, а затем ждут, пока ввод игнорируется.
И тогда, когда мне это понадобится в программе, у меня есть собственная pause (); функция, без накладных расходов на системную паузу. Это действительно проблема только при написании консольных программ, которые вы хотите оставить открытыми или фиксированными в определенной точке.
pause pause
Приостанавливает обработку пакетной программы, отображая запрос, Press any key to continue . . . Suspends the processing of a batch program, displaying the prompt, Press any key to continue . . .
Синтаксис Syntax
Параметры Parameters
Параметр Parameter | Description Description |
---|---|
/? /? | Отображение справки в командной строке. Displays help at the command prompt. |
Комментарии Remarks
Если нажать клавиши CTRL + C для завершения пакетной программы, появится следующее сообщение: Terminate batch job (Y/N)? . If you press CTRL+C to stop a batch program, the following message appears, Terminate batch job (Y/N)? . Если нажать клавишу Y (да) в ответ на это сообщение, пакетная программа завершает работу и управление возвращается операционной системе. If you press Y (for yes) in response to this message, the batch program ends and control returns to the operating system.
Команду Pause можно вставить перед разделом пакетного файла, который, возможно, не будет обрабатываться. You can insert the pause command before a section of the batch file that you might not want to process. Когда Pause приостанавливает обработку пакетной программы, можно нажать клавиши CTRL + C, а затем нажать клавишу Y , чтобы остановить пакетную программу. When pause suspends processing of the batch program, you can press CTRL+C and then press Y to stop the batch program.
Примеры Examples
Чтобы создать пакетную программу, предлагающую пользователю изменить диски на одном из дисков, введите: To create a batch program that prompts the user to change disks in one of the drives, type:
В этом примере все файлы на диске в диск A копируются в текущий каталог. In this example, all the files on the disk in Drive A are copied to the current directory. После того как в сообщении появится запрос на добавление нового диска в дисковод а, команда Pause приостанавливает обработку, чтобы можно было изменить диски и нажать любую клавишу, чтобы возобновить обработку. After the message prompts you to put a new disk in Drive A, the pause command suspends processing so that you can change disks and then press any key to resume processing. Эта пакетная программа выполняется в бесконечном цикле — команда goto Begin отправляет интерпретатор команд в начальную метку пакетного файла. This batch program runs in an endless loop—the goto begin command sends the command interpreter to the Begin label of the batch file.