Что такое system pause
Блог Петра Калинина
У языка программирования C++, а также у популярных IDE для этого языка, есть ряд особенностей, которые надо бы знать, чтобы эффективно писать на нем программы. В этом посте я постараюсь описать основные такие особенности, в первую очередь относящиеся к написанию небольших программ типа олимпиадных; возможно, в дальнейшем буду постепенно добавлять сюда что-нибудь. Сначала опишу особенности IDE, потому что они полезны даже тем, кто только начинает писать на C++, а потом особенности самого языка, которые нужны уже чуть более продвинутым школьникам.
Особенности IDE
На олимпиадах наиболее популярны две IDE по C++: это Code::blocks (полностью свободно распространяемая и кроссплатформеная) и Microsoft Visual Studo (есть бесплатный вариант, только под Windows, не путайте с Visual Studio Code!). Еще последнее время набирает популярность CLion, но у него нет полностью бесплатной версии, и я его (применительно к олимпиадам) не очень хорошо знаю, поэтому упоминать его не буду.
Code::blocks
Это достаточно простая IDE без особых заморочек, очень напоминает простые IDE из других языков программирования, типа Wing IDE для питона и встроенной IDE для Pascal ABC. Все просто: создаете новый файл, пишете код, запускаете кнопкой с зеленой стрелочкой (точнее, кнопкой с шестеренкой и зеленой стрелочкой, потому что вам обычно надо скомпилировать, и только потом запускать код). После запуска и завершения программы code::blocks задерживает окошко программы на экране, чтобы вы смогли посмотреть, что вывела ваша программа, поэтому вам не надо писать в конце программы какой-либо код для приостановки программы (типа system(«pause») или getch ).
Во-вторых, не так просто сделать, чтобы заработал дебаггер. Для этого, во-первых, надо, чтобы дебаггер был установлен на компьютере (code::blocks использует компилятор gcc и дебаггер gdb, надо, чтобы они были установлены), во-вторых, просто файлы, созданные по кнопке “new”, code::blocks не будет отлаживать. Чтобы дебаггер заработал, надо в code::blocks создать “проект”, и уже в “проект” добавить файл с исходным кодом (существующий или новый). Но это достаточно просто и прямолинейно.
Заметно более продвинутая, профессиональная, IDE. В ней вы не можете просто так создать новый файл, в ней надо создавать “проект”. И тут есть две проблемы.
Обе проблемы решаются правильным созданием проекта. А именно, при создании проекта надо явно убедиться, что вы указали два параметра для проекта: во-первых, это должно быть console application (это повлияет на задержку программы, см. ниже), во-вторых, это должно быть empty project (а это повлияет на pch).
Как это сделать, зависит от версии Visual Studio. В старых версиях в окошке создания проекта надо было выбрать тип проекта а-ля Console application, и уже далее в следующем окошке поставить галочку Empty project. В последних версиях надо выбрать тип проекта “Windows Desktop Wizard”, по-русски “Мастер классических приложений Windows” (не “пустой проект”, не “консольное приложение”, а именно “wizard”/”мастер”, его всегда непросто найти), и в следующем окошке в выпадающем меню выбрать Console application и поставить галочку Empty project.
Общие особенности
(Этот раздел в основном скопирован из моего текста про областную олимпиаду.)
Быстрый ввод-вывод
Стандартный ввод/вывод через iostream (т.е. с использованием cin / cout ) по умолчанию работает медленно на больших данных. Если вам надо ввести, допустим, 100000 чисел, то с использованием cin вы наверняка получите time limit; аналогично если вам надо выводить много данных. Это связано с двумя проблемами.
Во-вторых, есть еще проблема синхронизации с stdio (не буду сейчас подробнее писать, что это значит). Чтобы эту проблему побороть, есть три способа:
Лично я вам рекомендую использовать первый или последний вариант.
Установка стека
В популярных компиляторах C++ по умолчанию установлен очень маленький размер стека. Если в вашей программе глубокая рекурсия (например, если вы пишете поиск в глубину), то программа может упасть.
Число 64000000 в обоих примерах выше — это необходимый вам размер стека в байтах (в примерах 64 миллиона байт, т.е. примерно 64 Мб). Размер стека можете посчитать в уме исходя из вашей программы (умножьте глубину рекурсии на размер памяти, требуемый на один уровень рекурсии — это примерно сколько памяти занимают все переменные на одном уровне, плюс 10-20 байт), а можете и подобрать опытным путем — 32-64 Мб обычно достаточно. Учитывайте еще, конечно, ограничение по памяти.
Поэтому если вы пишете на MSVS, то всегда явно устанавливайте размер стека. Если пишете на g++ в code::blocks, настройте в настройках code::blocks для локального запуска, и надейтесь, что в тестирующей системе жюри это нормально настроит (по-нормальному это должно быть видно в памятке участника). Если пишете на g++ и компилируете из командной строки вручную, то добавляйте нужный параметр и, опять-таки, надейтесь на жюри. Если вдруг жюри не настроило стек на g++, но при этом предоставляет возможность отправки под MSVS, то добавьте магическую MSVS-строчку и отправляйте под MSVS, даже если вы пишете под g++.
Стандарты языка
У языка c++ есть разные версии, называемые стандартами. Из распространенных сейчас это C++03, C++11 (давным-давно был известен как C++0x), C++14 и C++17. Они отличаются небольшими, но зачастую удобными вещами (например, auto и range-based loops типа for (auto x : v) появились только в C++11).
вот вопрос, который я не совсем понял:
команды system(«pause»); преподается новым программистам как способ приостановить программу и дождаться продолжения ввода с клавиатуры. Однако, похоже, многие опытные программисты неодобрительно относятся к этому как к чему-то, что не следует делать в той или иной степени.
Я, сам новый программист без формального обучения программированию. Я использую его, потому что меня научили им пользоваться. Чего я не понимаю, так это того, что если это не то, что можно использовать, тогда почему меня учили использовать это? Или, с другой стороны, все не так уж плохо?
что вы думаете по этому поводу?
12 ответов
Он нахмурился, потому что это специфичный для платформы хак, который не имеет ничего общего с фактическим обучением программированию, но вместо этого, чтобы обойти функцию IDE/OS-окно консоли, запущенное из Visual Studio, закрывается, когда программа закончила выполнение, и поэтому новый пользователь не может видеть выход своей новой программы.
Bodging in System («pause») запускает программу командной строки Windows «pause» и ждет ее завершения, прежде чем продолжить выполнение программа-окно консоли остается открытым, поэтому вы можете прочитать вывод.
лучшей идеей было бы поставить точку останова в конце и отладить ее, но у этого снова есть проблемы.
это медленно. Это зависит от платформы. Это небезопасно.
Что делать, если программа под названием «пауза» была помещена в путь пользователя? Просто вызов системы («пауза») гарантирует только выполнение программы под названием «пауза «(надеюсь, что у вас нет ваш исполняемый файл с именем «пауза»!)
в основном: зачем вводить так много потенциальных проблем, когда вы можете просто добавить две строки кода и один включить и получить много более гибкий механизм?
простой getchar () должен делать все в порядке.
В общем, он должен приостановить выполнение программ и сделать системный вызов и выделить ненужные ресурсы, когда вы можете использовать что-то простое, как cin.получить.)( Люди используют System («пауза»), потому что они хотят, чтобы программа ждала, пока они не нажмут enter, чтобы они могли видеть свой вывод. Если вы хотите, чтобы программа ждала ввода, есть встроенные функции для того, что также кросс-платформенные и менее требовательные.
дальнейшее объяснение в этой статья.
используя system(«pause»); Это плохая практика™, потому что
это проблематично и раздражает
при запуске программы из командной строки. Для интерактивного выполнения вы должны нажать клавишу в конце без какой-либо цели. И для использования в автоматизации какой-то задачи, что pause очень нежелательно!
на внутренний cmd.exe команда и не может быть переопределенным, как ошибочно утверждается по крайней мере в одном другом ответе. Т. е. это не риск для безопасности, и утверждение, что AV-программы диагностируют его как таковое, столь же сомнительно, как и утверждение о переопределении команды (в конце концов, программа c++ вызывает system в состоянии сделать все, что может сделать интерпретатор команд, и многое другое). Кроме того, хотя этот способ приостановки чрезвычайно неэффективен по обычным стандартам программирования на C++, это не имеет никакого значения в конце новичка программа.
можно использовать std::cin.get() С iostream :
потому что это не портативный.
как указано в других ответах, есть много причин, которые вы можете найти, чтобы избежать этого. Все сводится к одной причине, которая делает остальное спорным. The System() функция по своей сути небезопасна / ненадежна и не должна вводиться в программу без необходимости.
для задания студента это условие никогда не выполнялось, и по этой причине я бы провалил задание, даже не запустив программу, если бы присутствовал вызов этого метода. (Это было ясно из начать.)
для меня вообще не имеет смысла ждать, прежде чем выходить без причины. Программа, которая сделала свою работу, должна просто закончить и передать свои ресурсы обратно своему создателю.
также не стоит молча ждать в темном углу после рабочего дня, ожидая, когда кто-то наклонит плечо.
вот одна из причин, по которой вы не должны использовать его: это будет раздражать большинство антивирусных программ, работающих на Windows, Если вы передаете программу на другую машину, потому что это угроза безопасности. Даже если ваша программа состоит только из простого cout Это тяжелый ресурс, и программа получает доступ к команде cmd, которую антивирусы рассматривают как угрозу.
профессионал в использовании системы («пауза»); при создании небольших частей вашей программы для отладки ее самостоятельно. если вы используете его для получения результатов переменных до и после каждого процесса, чтобы убедиться, что они работают правильно.
после тестирования и перемещения его в полный ход с остальной частью решения вы должны удалить эти строки. это действительно хорошо при тестировании пользовательского алгоритма и обеспечении того, что вы делаете все правильно заказ для результатов, которые вы хотите.
ни в коем случае вы не хотите использовать это в приложении после того, как вы протестировали его и заверили, что он работает правильно. Однако это позволяет отслеживать все, что происходит, как это происходит. Не используйте его для приложений конечного пользователя вообще.
все дело в стиле. Это полезно для отладки, но в противном случае он не должен использоваться в окончательной версии программы. Это действительно не имеет значения в вопросе памяти, потому что я уверен, что те ребята, которые изобрели систему(«пауза»), ожидали, что она будет использоваться часто. С другой стороны, компьютеры регулируют свою память для всего остального, что мы используем на компьютере, и это не представляет прямой угрозы, такой как динамическое распределение памяти, поэтому я бы рекомендовал его для отладка кода, но ничего больше.
Вот вопрос, который я не совсем понимаю:
Команда system(«pause»); преподается новым программистам как способ приостановить программу и дождаться продолжения ввода с клавиатуры. Однако многие опытные программисты, похоже, не одобряют это, как то, что не следует делать в той или иной степени.
Некоторые говорят, что это нормально. Некоторые говорят, что его можно использовать только тогда, когда вы заперты в своей комнате и никто не смотрит. Некоторые говорят, что они лично придут к вам домой и убьют вас, если вы им воспользуетесь.
Я сам новый программист без формального обучения программированию. Я использую его, потому что меня научили этим пользоваться. Я не понимаю, что если это не то, что нужно использовать, то почему меня учили этим пользоваться? Или, с другой стороны, все-таки не так уж и плохо?
Что вы думаете по этому поводу?
13 ответов
Лучшей идеей было бы поставить точку останова в конце и отладить ее, но здесь снова есть проблемы.
Простой getchar () подойдет.
Это проблемно и раздражает
при запуске программы из командной строки. Для интерактивного выполнения вы должны нажимать клавишу в конце без какой-либо цели. И для использования в автоматизации некоторых задач, которые pause очень нежелательны!
Таким образом, он должен приостанавливать выполнение программ и выполнять системный вызов и выделять ненужные ресурсы, когда вы могли бы использовать что-то столь же простое, как cin.get (). Люди используют Систему («ПАУЗА»), потому что они хотят, чтобы программа ждала, пока они не нажмут Enter, чтобы они могли увидеть свой вывод. Если вы хотите, чтобы программа ожидала ввода, для этого есть встроенные функции, которые также являются кроссплатформенными и менее требовательными.
Дальнейшее объяснение см. В этой статье.
Вы можете использовать std::cin.get() из iostream :
Потому что он не переносится.
Как указано в других ответах, есть много причин, по которым вы можете избежать этого. Все сводится к одной причине, которая делает остальное спорным. Функция System() по своей природе небезопасна / ненадежна, и ее не следует вводить в программу без необходимости.
Для студенческого задания это условие никогда не выполнялось, и по этой причине я бы провалил задание, даже не запустив программу, если бы присутствовал вызов этого метода. (Это было ясно с самого начала.)
Для меня вообще нет смысла ждать перед выходом без причины. Программа, которая выполнила свою работу, должна просто завершить работу и передать свои ресурсы ее создателю.
Также не стоит молча ждать в темном углу после рабочего дня, ожидая, что кто-то опрокинет плечо.
Неверно, потому что это часть Windows API и поэтому не будет работать в других операционных системах.
Вам следует попробовать использовать только объекты из стандартной библиотеки C ++. Лучшим решением будет написать:
Вот одна из причин, по которой вы не должны его использовать: это вызовет раздражение у большинства антивирусных программ, работающих в Windows, если вы передадите программу другому компьютеру, потому что это угроза безопасности. Даже если ваша программа состоит только из простого cout Это ресурсоемкий процесс, и программа получает доступ к команде cmd, которую антивирусы считают угрозой.
Все дело в стиле. Это полезно для отладки, но в остальном его не следует использовать в окончательной версии программы. На самом деле это не имеет значения по поводу памяти, потому что я уверен, что те ребята, которые изобрели систему («пауза»), ожидали, что она будет часто использоваться. С другой стороны, компьютеры в любом случае ограничивают свою память для всего остального, что мы используем на компьютере, и это не представляет прямой угрозы, такой как динамическое выделение памяти, поэтому я бы рекомендовал его для отладки кода, но не более того.
Это медленно. Это зависит от платформы. Это небезопасно.
Во-первых: что он делает. Вызов «system» буквально похож на ввод команды в командной строке Windows. Чтобы ваше приложение совершило такой вызов, требуется множество настроек и разборок, а накладные расходы просто смехотворны.
Что, если программа под названием «пауза» была помещена в пользовательский PATH? Просто вызов системы («пауза») гарантирует только выполнение программы с именем «пауза» (надеюсь, что у вас нет исполняемого файла с именем «пауза»!)
По сути: зачем вводить столько потенциальных проблем, если можно просто добавить две строки кода и одну включить и получить гораздо более гибкий механизм?
Плюсы к использованию системы («ПАУЗА»); в то время как создание небольших частей вашей программы предназначено для ее самостоятельной отладки. если вы используете его для получения результатов переменных до и после каждого используемого вами процесса, чтобы убедиться, что они работают правильно.
После тестирования и приведения его в действие с остальной частью раствора вы должны удалить эти линии. это действительно хорошо при тестировании определенного пользователем алгоритма и обеспечении уверенности в том, что вы делаете все в правильном порядке для получения желаемых результатов.
Ни в коем случае вы не хотите использовать это в приложении после того, как протестировали его и убедились, что оно работает правильно. Однако это позволяет вам отслеживать все, что происходит, по мере того, как это происходит. Ни в коем случае не используйте его для приложений конечных пользователей.
разъяснение системы («пауза»)
Когда я использую систему («пауза»), на экране появляется строка «Нажмите любую клавишу, чтобы продолжить …».
Это раздражает и делает чтение вывода довольно громоздким.
Есть ли какой-нибудь способ остановить это?
Решение
Вы имеете в виду, что вы хотите нажать любую клавишу для продолжения, но не отображать «Нажмите любую клавишу для продолжения» на экране? Попробуй это getchar(); это захватит ввод одного символа с клавиатуры и продолжит.
Другие решения
Вместо использования платформы зависит system(«pause») Вы можете использовать платформу независимо std::cin.get() и если буфер мешает с этим, вы можете использовать:
перед рукой очистить буфер.
Прежде всего, вы должны никогда использование system(«pause») потому что это опасно. Ваш код будет вызывать внешнюю системную процедуру без причины; и взломщик может найти способ заменить команду «пауза» другой, заставляя вашу программу вызывать другую программу с вашими правами пользователя.
Тем не менее, вы можете избежать отправки сообщения null устройство.
И если вы хотите быть смелым, чтобы сделать этот ужасный системный вызов переносимым, вы можете использовать:
эхо Нажмите любую клавишу, чтобы продолжить …; читать х
Теперь вы можете применить ИЛИ ЖЕ а также А ТАКЖЕ (логические связки) для обоих и сделать системный вызов, который работает на обеих системах:
Эта команда имитирует оригинал. Если вы хотите, чтобы избежать сообщения, просто удалите echo Pres. Часть этого.
Thread: system(«pause»)
Thread Tools
Search Thread
Display
system(«pause»)
I went along and completed the small «hello world» tutorial along with the tutorial on the introduction to C. After building and running the programs, I navigated to «. \bin\Debug\file.exe» to see if the program would run without having to run the program within Code::Blocks. The «hello world» program closed immediately upon executing it, while the other program closed before letting me input a number. After a quick Google search later, it seems that inputting the following code allows the program to stay open long enough for me to see/interact with it:
I wanted to know if this is the best way to achieve what I am aiming to do? I’m very new to programming (I start attending classes for my computer science major this fall at university), so I am trying to learn whatever I can as to get an idea to what I am getting myself into. I am a bit stubborn in trying to learn C first before C++, so bear with me if this seems to be a painfully easy question to ask or anything.
It isn’t the best way because «pause» is a Windows-specific command. Also, calling system() itself is considered a security risk, because the program executed may not be what you expect it to be.
The «proper» way to pause is to either:
1) Always read entire lines, so as to not leave newlines behind that you don’t want. Then just simply call getchar().
2) Disable console input buffering, which is very OS-dependent.
3) Ask for a single printable character and Enter in order to continue.
EDIT:
If I were you, I’d go for the first option. You just need a buffer, fgets() and sscanf():
Re: system(«pause»)
It isn’t the best way because «pause» is a Windows-specific command. Also, calling system() itself is considered a security risk, because the program executed may not be what you expect it to be.
The «proper» way to pause is to either:
1) Always read entire lines, so as to not leave newlines behind that you don’t want. Then just simply call getchar().
2) Disable console input buffering, which is very OS-dependent.
3) Ask for a single printable character and Enter in order to continue.
After looking at «hello world» example that I posted, I noticed immediately that I did not even attempt to throw in getchar() after compiling the program. I followed the first bit of advice you gave (along with shaking my head at my carelessness), and the program performs exactly as I wanted it to.
The second code I posted, however, continued to give me an issue. I took out any newlines I could find and placed getchar() in three specific places:
Once again, as I executed the program from my hard drive, the program would end immediately after inputting a number (not displaying the «You entered [number].» I am not too sure why using getchar() did not work here, unless it has something to do with there being multiple instances where I would have to enter a keystroke as compared to the «hello world» example (where I only had to enter a keystroke once).
So I searched around some more and found this guide. After adding the code into my program, it performs exactly as I intended. I suppose this is what you might have been referring to in your third bit of advice?
I don’t seem to understand this too well. I am hoping that as I progress further into the tutorials, I will have some kind of understanding as to how to work with this (I saved the code onto another project folder just to play around with later).
I fear that while I can see how a particular code works, I am having a hard time understanding as to why it works. With both examples that I had, despite getting them to perform the way I intended, I’m having a hard time grasping how getchar() and the information from that guide make it possible. I guess I just need to read more closely!
Don’t worry, with practice and experience you will understand how things work soon enough. If not, you’re always welcome to ask, assuming you couldn’t get your answer from some tutorial or article.
It really depends on how you decide to run your program.
1. In the IDE.
Most IDE’s (eg recent versions of code::blocks) automatically hold the console window open when the process exits.
Here you will find the extra ‘press a key to continue’ somewhat amusing since you’ll get prompted twice.
3. Run from the command line.
From a console command lines, typing in \path\to\program.exe just runs the program as you would expect. The window doesn’t close when the program exits.
Here you will find the extra ‘press a key to continue’ somewhat annoying.
4. Run in a batch file / other process.
If you get to the point where your program is doing something useful, perhaps you want to integrate it with other programs.
Eg.
Here you will find the extra ‘press a key to continue’ downright frustrating.
Re: system(«pause»)
Thank you. I apologize for asking painfully obvious questions, especially with both the code examples I have provided being fixed thanks to guides within the main site (though you pointing me in the right direction was what got me to look around more). Regardless, I really do appreciate it. If anything, this thread reinforced me to practically stay away from ever using system(«pause»).
It really depends on how you decide to run your program.
1. In the IDE.
Most IDE’s (eg recent versions of code::blocks) automatically hold the console window open when the process exits.
Here you will find the extra ‘press a key to continue’ somewhat amusing since you’ll get prompted twice.
3. Run from the command line.
From a console command lines, typing in \path\to\program.exe just runs the program as you would expect. The window doesn’t close when the program exits.
Here you will find the extra ‘press a key to continue’ somewhat annoying.
4. Run in a batch file / other process.
If you get to the point where your program is doing something useful, perhaps you want to integrate it with other programs.
Eg.
The fourth option is definitely foreign to me, but I look forward to learning more about C and getting to that point where I can integrate programs with others. Code::Blocks has been keeping the program open after it ends (with the amusing ‘press a key to continue’ prompt appearing twice).
I guess opening up from Explorer is not really the best way to go about opening the sort of programs I am making at the moment (the «hello world» and other program that just tells you the number you’ve typed)? It just seems more efficient running it through CMD!