Вот вопрос, который я не совсем понимаю:
Эта команда system("pause");
преподается новым программистам как способ приостановить программу и дождаться продолжения ввода с клавиатуры. Однако многие опытные программисты, похоже, не одобряют это, как то, что не следует делать в той или иной степени.
Некоторые люди говорят, что это нормально. Некоторые говорят, что его можно использовать только тогда, когда вы заперты в своей комнате и никто не смотрит. Некоторые говорят, что они лично придут к вам домой и убьют вас, если вы им воспользуетесь.
Я сам новый программист без формального обучения программированию. Я использую его, потому что меня научили им пользоваться. Чего я не понимаю, так это того, что если это не то, что нужно использовать, то почему меня учили этим пользоваться? Или, с другой стороны, все-таки не так уж и плохо?
Что вы думаете по этому поводу?
Ответы:
Это не одобряется, потому что это специфический для платформы взлом, который не имеет ничего общего с фактическим обучением программированию, а вместо этого позволяет обойти особенность IDE / OS - окно консоли, запущенное из Visual Studio, закрывается, когда программа завершает выполнение, и поэтому новый пользователь не видит вывода своей новой программы.
Bodging in System («пауза») запускает программу «паузы» в командной строке Windows и ожидает ее завершения, прежде чем продолжить выполнение программы - окно консоли остается открытым, чтобы вы могли прочитать вывод.
Лучшей идеей было бы поставить точку останова в конце и отладить ее, но здесь снова есть проблемы.
источник
pause
это внутренняя команда вcmd.exe
). Список лучших идей также сильно отсутствует.IsDebuggerPresent()
возвращает true, и должным образом задокументируйте этот обходной путь («почему здесь этот код?»).Это медленно. Это зависит от платформы. Это небезопасно.
Во-первых: что он делает. Вызов «система» буквально похож на ввод команды в командной строке Windows. Чтобы ваше приложение совершило такой вызов, требуется множество настроек и демонтажа, а накладные расходы просто смехотворны.
Что, если программа под названием «пауза» была помещена в пользовательский PATH? Просто вызов системы («пауза») гарантирует только выполнение программы с именем «пауза» (надеюсь, что у вас нет исполняемого файла с именем «пауза»!)
Просто напишите свою собственную функцию «Pause ()», которая использует _getch. Хорошо, конечно, _getch также зависит от платформы (примечание: он определен в "conio.h") - но он намного лучше, чем
system()
если бы вы разрабатываете в Windows, и имеет тот же эффект (хотя вы обязаны предоставить текст с cout или около того).По сути: зачем вводить столько потенциальных проблем, если можно просто добавить две строки кода и одну включить и получить гораздо более гибкий механизм?
источник
_getch
, особенно когда это предусмотрено стандартным C ++getchar
.простой getchar () подойдет.
источник
Использование
system("pause");
- это Ungood Practice ™, потому чтоЭто совершенно не нужно .
Чтобы окно откройте консоль программы в конце , когда вы запускаете его из Visual Studio, использование Ctrl+ , F5чтобы запустить его без отладки, или другое место , точку останова в последней правой фигурной скобкой
}
вmain
. Итак, в Visual Studio проблем нет. И, конечно же, никаких проблем при запуске из командной строки.Это проблематично и раздражает,
когда вы запускаете программу из командной строки. Для интерактивного выполнения вы должны нажимать клавишу в конце без какой-либо цели. И для использования в автоматизации некоторых задач, которые
pause
очень нежелательны!Это не переносно.
Unix-land не имеет стандартной
pause
команды.Это
pause
внутренняяcmd.exe
команда, и ее нельзя переопределить, поскольку это ошибочно заявлено как минимум в одном другом ответе. Т.е. это не угроза безопасности, и утверждение о том, что антивирусные программы диагностируют его как таковое, столь же сомнительно, как и утверждение о переопределении команды (в конце концов, вызываемая программа на C ++system
может делать все, что может делать интерпретатор команд, и Больше). Кроме того, хотя этот способ приостановки крайне неэффективен по обычным стандартам программирования на C ++, это не имеет никакого значения в конце программы для новичка.Итак, утверждения в толпе ответов перед этим неверны, и основная причина, по которой вы не должны использовать
system("pause")
или любую другую команду ожидания в конце вашегоmain
, - это первый пункт выше: это совершенно не нужно, это абсолютно бесполезно , это просто очень глупо.источник
Таким образом, он должен приостанавливать выполнение программ и выполнять системный вызов и выделять ненужные ресурсы, когда вы могли бы использовать что-то столь же простое, как cin.get (). Люди используют Систему («ПАУЗА»), потому что они хотят, чтобы программа ждала, пока они нажмут ввод, чтобы они могли видеть свой вывод. Если вы хотите, чтобы программа ждала ввода, для этого есть встроенные функции, которые также являются кросс-платформенными и менее требовательными.
Дальнейшее объяснение в этой статье.
источник
Вы можете использовать
std::cin.get()
сiostream
:Кроме того,
system('pause')
идет медленно, и включает в себя файл , который вы , вероятно , не нужно:stdlib.h
. Он зависит от платформы и фактически вызывает «виртуальную» ОС.источник
System("pause")
на первом курсе программирования, но я хотел иметь возможность запускать свои программы на моем Mac, поэтому мне пришлось узнать об этомcin.get()
.Потому что он не переносится.
это программа только для Windows / DOS, поэтому ваш код не будет работать в Linux. Кроме того, как
system
правило , не рассматривается как очень хороший способ , чтобы вызвать другую программу - это, как правило , лучше использоватьCreateProcess
илиfork
или что - то подобное.источник
Как указано в других ответах, есть много причин, по которым вы можете избежать этого. Все сводится к одной причине, которая делает остальное спорным.
System()
Функция небезопасна / ненадежная, и не должна быть введена в программу без необходимости.Для студенческого задания это условие никогда не выполнялось, и по этой причине я бы провалил задание, даже не запустив программу, если бы присутствовал вызов этого метода. (Это было ясно с самого начала.)
источник
Для меня вообще не имеет смысла ждать перед выходом без причины. Программа, которая выполнила свою работу, должна просто завершить работу и передать свои ресурсы ее создателю.
Также не стоит молча ждать в темном углу после рабочего дня, ожидая, когда кто-то опрокинет плечо.
источник
system("pause")
сам по себе ничего не отображает. Программа интерфейса командной строки, которая вызывается не из командной строки и закрывается слишком рано, вызывается неправильно и с неправильными параметрами, и использованиеsystem("pause")
для обхода неправильно запущенной программы на самом деле не является правильным.cat
,less
,vi
,OpenOffice
,Mathematica
,GNU Octave
, что , если бы они используютsystem("pause")
? Это было бы неприятно.system("pause")
, тогда как ваш ответ говорит о «подождать перед выходом», что является гораздо более обобщенной концепцией. Многие из приведенных вами примеров на самом деле «ждут перед выходом», пока пользователь не сообщит программе, что он хочет, чтобы она завершилась. Я согласен, чтоsystem("pause")
это не лучший способ добиться этого и что есть решения лучше, но ваш ответ не об этом.pause
прочь!неверно, потому что это часть Windows API и поэтому не будет работать в других операционных системах.
Вам следует попробовать использовать только объекты из стандартной библиотеки C ++. Лучшим решением будет написать:
Но это также вызовет проблемы, если
cin
в вашем коде есть другие s. Потому что после каждогоcin
вы нажимаетеEnter
или,\n
который является символом пробела.cin
игнорирует этот символ и оставляет его в буферной зоне, ноcin.get()
получает оставшийся символ. Таким образом, управление программой достигает линии,return 0
и консоль закрывается, прежде чем вы сможете увидеть результаты.Чтобы решить эту проблему, мы пишем следующий код:
источник
system()
является стандартным и не относится к MS Windows. Однако командаpause
оболочки является наследием DOS и обычно встречается только там.Вот одна из причин, по которой вы не должны его использовать: это вызовет раздражение у большинства антивирусных программ, работающих в Windows, если вы передадите программу другому компьютеру, потому что это угроза безопасности. Даже если ваша программа состоит только из простой
cout << "hello world\n"; system("pause");
ресурсоемкой программы, и программа получает доступ к команде cmd, которую антивирусы считают угрозой.источник
плюсы к использованию системы («ПАУЗА»); а создание небольших частей вашей программы предназначено для ее самостоятельной отладки. если вы используете его для получения результатов переменных до и после каждого используемого вами процесса, чтобы убедиться, что они работают правильно.
После тестирования и приведения его в действие с остальным раствором следует удалить эти линии. это действительно хорошо при тестировании определенного пользователем алгоритма и обеспечении уверенности в том, что вы делаете все в правильном порядке для достижения желаемых результатов.
Ни в коем случае вы не хотите использовать это в приложении после того, как протестировали его и убедились, что оно работает правильно. Однако это позволяет вам отслеживать все, что происходит, по мере того, как это происходит. Ни в коем случае не используйте его для приложений конечных пользователей.
источник
Все дело в стиле. Это полезно для отладки, но в остальном его не следует использовать в окончательной версии программы. На самом деле это не имеет значения по поводу памяти, потому что я уверен, что те ребята, которые изобрели систему («пауза»), ожидали, что она будет часто использоваться. С другой стороны, компьютеры в любом случае ограничивают свою память для всего, что мы используем на компьютере, и это не представляет прямой угрозы, такой как динамическое выделение памяти, поэтому я бы рекомендовал его для отладки кода, но не более того.
источник
pause
был разработан для использования в пакетных программах DOS, он никогда не предназначался для использования таким образом. Кроме того, существовали гораздо лучшие альтернативы, прежде чем кто-либо стал настолько сумасшедшим, чтобы напечатать фразуsystem("pause");
.