Система ( "пауза");- Почему это не так? - PullRequest
117 голосов
/ 10 июля 2009

Вот вопрос, который я не совсем понимаю:

Команда system("pause"); преподается новым программистам как способ приостановить программу и ждать продолжения ввода с клавиатуры. Тем не менее, многие ветераны-программисты считают, что это не следует делать в разной степени.

Некоторые люди говорят, что это нормально. Некоторые говорят, что его можно использовать только тогда, когда вы заперты в своей комнате, и никто не смотрит. Некоторые говорят, что они лично придут к вам домой и убьют вас, если вы им воспользуетесь.

Я сам новый программист без формального обучения программированию. Я использую это, потому что меня учили использовать это. Чего я не понимаю, так это того, что если это не то, что нужно использовать, то почему меня научили это использовать? Или, с другой стороны, это действительно не так уж плохо в конце концов?

Что вы думаете об этом предмете?

Ответы [ 13 ]

74 голосов
/ 10 июля 2009

Его осуждают, потому что это хак для конкретной платформы, который не имеет ничего общего с фактически изучением программирования, а вместо этого обходит особенность IDE / OS - окно консоли, запускаемое из Visual Studio, закрывается, когда программа завершает выполнение и поэтому новый пользователь не может видеть результаты своей новой программы.

Bodging in System («пауза») запускает программу «пауза» командной строки Windows и ожидает ее завершения, прежде чем она продолжит выполнение программы - окно консоли остается открытым, поэтому вы можете прочитать вывод.

Лучше было бы поставить точку останова в конце и отладить ее, но это опять-таки имеет проблемы.

35 голосов
/ 10 июля 2009

Это медленно. Это зависит от платформы. Это небезопасно.

Первый: что он делает. Вызов «system» буквально похож на ввод команды в командной строке Windows. Существует множество настроек и разрывов для вашего приложения, чтобы сделать такой вызов - и это просто смешно.

Что если программа под названием «пауза» была помещена в PATH пользователя? Простой вызов system («pause») только гарантирует, что будет выполнена программа под названием «pause» (надеюсь, что у вас нет исполняемого файла с именем «pause»!)

Просто напишите свою собственную функцию "Pause ()", которая использует _getch. Хорошо, конечно, _getch также зависит от платформы (примечание: оно определено в «conio.h») - но это гораздо приятнее, чем system(), если вы разрабатываете для Windows, и имеет тот же эффект (хотя вы несете ответственность за предоставить текст cout или около того).

По существу: зачем создавать так много потенциальных проблем, когда вы можете просто добавить две строки кода и одну строку и получить гораздо более гибкий механизм?

24 голосов
/ 10 июля 2009
  • медленно: он должен прыгать через много ненужный код Windows и отдельная программа для простого операция
  • не переносимо: зависит от программа паузы
  • не хороший стиль: системный вызов должен быть только сделано, когда действительно необходимо
  • подробнее набрав: система («пауза») длиннее чем getchar ()

простой getchar () должен прекрасно работать.

20 голосов
/ 30 декабря 2015

Использование system("pause"); - неуместная практика и торговля; потому что

  • Это полностью ненужно .
    Чтобы держать окно консоли программы открытым в конце при запуске из Visual Studio, используйте Ctrl + F5 , чтобы запустить его без отладки, или установите точку останова на последней правой скобке } из main. Так что нет проблем в Visual Studio. И, конечно, никаких проблем при запуске из командной строки.

  • Это проблематично и раздражает
    при запуске программы из командной строки. Для интерактивного исполнения вы должны нажать клавишу в конце, без какой-либо цели. И для использования в автоматизации некоторых задач, которые pause очень нежелательны!

  • Это не портативный.
    Unix-land не имеет стандартной команды pause.

Команда pause является внутренней командой cmd.exe и не может быть переопределена, как ошибочно заявлено по крайней мере в одном другом ответе. То есть это не угроза безопасности, и утверждение о том, что AV-программы его диагностируют как таковое, столь же сомнительно, как утверждение о переопределении команды (в конце концов, программа на C ++, вызывающая system, в состоянии выполнить все, что может сделать интерпретатор команд , и больше). Кроме того, хотя этот способ приостановки крайне неэффективен по обычным стандартам программирования на C ++, это не имеет значения в конце программы новичка.

Таким образом, утверждения в орде ответов до этого неверны, и основная причина, по которой вы не должны использовать system("pause") или любую другую команду ожидания в конце вашего main, Это первый пункт выше: это совершенно не нужно, это абсолютно бесполезно, просто очень глупо.

18 голосов
/ 10 июля 2009

Таким образом, он должен приостановить выполнение программ, сделать системный вызов и выделить ненужные ресурсы, когда вы можете использовать что-то такое простое, как cin.get ().Люди используют Систему («ПАУЗА»), потому что они хотят, чтобы программа ждала, пока они не нажмут клавишу ввода, чтобы они могли видеть свои результаты.Если вы хотите, чтобы программа ожидала ввода, есть встроенные функции для кроссплатформенных и менее требовательных.

Дальнейшее объяснение в этой статье.

14 голосов
/ 16 июля 2013

Вы можете использовать std::cin.get() из iostream:

#include <iostream> // std::cout, std::cin
using namespace std;

int main() {
   do {
     cout << '\n' << "Press the Enter key to continue.";
   } while (cin.get() != '\n');

   return 0;
}

Кроме того, system('pause') медленный и включает файл, который вам, вероятно, не нужен: stdlib.h. Он зависит от платформы и фактически вызывает «виртуальную» ОС.

9 голосов
/ 10 июля 2009

Потому что это не портативный.

pause

- это программа только для Windows / DOS, поэтому этот код не будет работать на Linux. Более того, system обычно не считается очень хорошим способом вызова другой программы - обычно лучше использовать CreateProcess или fork или что-то подобное.

4 голосов
/ 07 июня 2010

Как указано в других ответах, есть много причин, чтобы избежать этого. Все сводится к одной причине, которая делает спор остальным. Функция System() изначально небезопасна / ненадежна и не должна вводиться в программу без необходимости.

Для студенческого задания это условие никогда не выполнялось, и по этой причине я не смог бы выполнить задание, даже не запустив программу, если присутствовал вызов этого метода. (Это было ясно с самого начала.)

2 голосов
/ 08 февраля 2013

Для меня вообще не имеет смысла ждать, прежде чем выйти без причины. Программа, которая выполнила свою работу, должна просто завершиться и передать свои ресурсы своему создателю.

Нельзя также молча ждать в темном углу после рабочего дня, ожидая, когда кто-то опрокинет плечо.

0 голосов
/ 25 мая 2019
system("pause");  

неверно, потому что он является частью Windows API и поэтому не будет работать в других операционных системах.

Вы должны попытаться использовать только объекты из стандартной библиотеки C ++. Лучшим решением будет написать:

cin.get();
return 0;

Но это также вызовет проблемы, если у вас есть другие cin в вашем коде. Потому что после каждого cin вы будете нажимать Enter или \n, который является символом пробела. cin игнорирует этот символ и оставляет его в буферной зоне, но cin.get() получает этот оставшийся символ. Таким образом, управление программой достигает строки return 0, и консоль закрывается, прежде чем вы увидите результаты.
Чтобы решить эту проблему, мы пишем код следующим образом:

cin.ignore();  
cin.get();  
return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...