Пауза консоли в программе на C ++

Какой лучший способ приостановить консоль в программах на C ++?

  1. используя cin.get()
  2. или с использованием system("pause")
  3. или с использованием функций 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() .

Наилучший способ зависит от того, на какой платформе (ах) нацелены, отладки и использования релиза и т. Д.

Я не думаю, что есть один лучший способ, но «принудительно» NDEBUG сценарий ввода типа довольно обычным образом, особенно при отладке (обычно это либо скомпилировано, либо на основе NDEBUG или _DEBUG ), вы можете попробовать std::getline следующим образом

 inline void wait_on_enter() { std::string dummy; std::cout << "Enter to continue..." << std::endl; std::getline(std::cin, dummy); } 

При необходимости без необходимости «вводить, чтобы продолжить».

Нет хорошего способа сделать это, но вы должны использовать портативное решение, поэтому избегайте вызовов system() , в вашем случае вы можете использовать cin.get() или getch() как вы упомянули в своем вопросе, также есть один совет , Сделать все паузы управляемыми одним (или очень немногим) определением препроцессора.

Например:

Где-то в глобальном файле:

 #define USE_PAUSES #ifndef _DEBUG //I asume you have _DEBUG definition for debug and don't have it for release build #undef USE_PAUSES #endif 

Где-то в коде

 #ifdef USE_PAUSES cin.get(); #endif 

Это не универсальный совет, но вы должны защитить себя от создания пауз в assemblyх выпусков, и они должны иметь легкий контроль, мой упомянутый глобальный файл может быть не настолько глобальным, потому что изменения в этом могут привести к очень длительной компиляции.

Какой лучший способ приостановить консоль в программах на C ++?

system("pause"); и getch(); (который поступает из мира DOS, IIRC) являются неспортивными.

Лучше ли использовать cin.get () для приостановки консоли?

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

На всякий случай вам нужно приостановить программу для программы my-program-is-launch-from-the-IDE и-немедленно-закрыто, но я не хочу иметь достаточно времени для просмотра, результат причина – не делаю. Просто настройте свои IDE или запускайте консольные программы прямо с консоли.

Я просто хочу добавить, что есть способ получить то, что вы хотите, но для этого потребуется использовать некоторую стороннюю библиотеку (или вы сами пишете код, зависящий от платформы).

Насколько мне известно, самым большим недостатком cin является то, что вам нужно нажать Return, а не только любой ключ.

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

Я думаю что-то вроде:

 char wait_for_key() { int key; while ( ! (key == key_pressed(ANY)) ) { this_thread::yield(); } return convert_virtual_key_to_char(key); } 

Фактическая функция, очевидно, будет сильно отличаться от того, что я написал, в зависимости от используемой библиотеки.

Я знаю, что в следующих библиотеках есть keylisteners (Не стесняйтесь добавлять больше в редактирование, если знаете что-либо.):

  • ключевой код
  • SDL

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

Что-то вроде:

 void pause() { cin.clear(); cout << endl << "Press any key to continue..."; cin.ignore(); } 

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

Это работает для меня.

 void pause() { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); std::string dummy; std::cout << "Press any key to continue . . ."; std::getline(std::cin, dummy); } 

(Мой ответ частично основан на том, что от Yoank , и частично на комментарии Джастина Тайна по другому вопросу.)

 cout << endl << "Press  to continue..."; cin.ignore(numeric_limits::max(), '\n'); cin.get(); 

Поздний ответ, но я думаю, что это поможет другим.

Часть имитационной системы («пауза») имитирует то, что она просит пользователя: «Нажмите любую клавишу, чтобы продолжить …» Итак, нам нужно что-то, что не ждет просто возврата в виде std :: cin.get ( ) сделал бы. Даже у getch () есть свои проблемы при использовании дважды (второй раз был замечен, чтобы пропустить паузу вообще, если он снова снова приостановился после того же нажатия клавиши). Я думаю, что это связано с входным буфером. Систему («пауза») обычно не рекомендуется, но нам все же нужно что-то подражать тем, что пользователи могут ожидать. Я предпочитаю getch (), потому что он не выступает на экран, и он работает динамически.

Решение состоит в том, чтобы сделать следующее, используя цикл do-while:

 void Console::pause() { int ch = 0; std::cout << "\nPress any key to continue . . . "; do { ch = getch(); } while (ch != 0); std::cout << std::endl; } 

Теперь он ждет, чтобы пользователь нажал любую клавишу. Если он используется дважды, он ждет пользователя снова, а не пропускает.

  • Как установить заголовок Content-Type для запроса HttpClient?
  • Запрос LINQ в DataTable
  • Вызывающий stream не может получить доступ к этому объекту, потому что ему принадлежит другой stream. WPF
  • Как получить двойные кавычки в строковый литерал?
  • Как объединить два массива в C #?
  • Самый быстрый способ преобразования изображения в байтовый массив
  • Запрос был прерван: не удалось создать безопасный канал SSL / TLS
  • Невозможно найти один или несколько типов, необходимых для компиляции динамического выражения. Вам не хватает ссылки на файлы Microsoft.CSharp.dll и в System.Core.dll?
  • Преобразование ASP.NET MVC Razor @helper в метод вспомогательного classа
  • Как слить скаляр в вектор без компилятора, теряющего инструкцию обнуления верхних элементов? Ограничение дизайна в встроенных средах Intel?
  • Обеспечьте сильную проверку типов в C (строгость строгости для typedefs)
  • Interesting Posts

    Обновление Windows вызвало прекращение работы MVC3 и MVC4

    Разделить столбец конкатенированных данных с разделителями-запятыми и вывести их в качестве коэффициентов

    Загрузка нового fxml в ту же сцену

    Версия SQLite, используемая в Android?

    Могу ли я передать аргумент VBScript (файл vbs, запущенный cscript)?

    Подсети 90.103.80.0/21 в 8 подсети с не менее чем 250 хостами в подсети

    Создайте приложение, срок действия которого истекает после пробного периода

    Как я могу стать корнем в Йосемити?

    Ячейка OpenSSL не скомпилирована в Mac OS X 10.11

    Обнаружен цикл саморегуляции – Возврат данных из WebApi в браузер

    Найдите расстояние между двумя точками на карте с помощью Google Map API V2

    Узнайте, какие classы данного API используются

    Сначала аутентификация с использованием Facebook, а затем Google вызывает ошибку в Firebase для Android.

    Захват видеоэкрана, который поддерживает виртуальный рабочий стол

    Как вы называете Variadic-метод Objective-C от Swift?

    Давайте будем гением компьютера.