Как остановить консольное приложение C++ от выхода немедленно?

в последнее время я пытаюсь изучить C++ от этот сайт. К сожалению, всякий раз, когда я пытаюсь запустить один из образцов кода, я вижу, что программа открывается примерно на полсекунды, а затем сразу закрывается. Есть ли способ остановить немедленное закрытие программы, чтобы я мог увидеть плоды своих усилий?

30 ответов


Edit: как справедливо указывает Чарльз Бейли в комментарии ниже, это не будет работать, если есть символы, буферизованные в stdin, и нет действительно хорошего способа обойти это. Если вы работаете с подключенным отладчиком, Джон Dibling это, вероятно, самое чистое решение вашей проблемы.

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


в конце main функция, вы можете вызвать std::getchar();

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

вам нужно #include <cstdio> на getchar.


Если вы используете Visual Studio и запускаете консольное приложение из среды IDE:

клавишей сочетания клавиш Ctrl-клавишу F5 (запуск без отладки) запустит приложение и будет держать окно консоли открытым, пока вы не нажмете любую клавишу.


решение Джеймса работает для всех платформ.

также на Windows вы также можете добавить следующее непосредственно перед возвращением из main функция:

  system("pause");

это будет работать pause команда, которая ждет, пока вы нажмете клавишу, а также отображает хорошее сообщение Press any key to continue . . .


Если вы используете Microsoft Visual C++ 2010 Express и запускаете проблему с сочетание клавиш Ctrl+клавишу F5 не работает для сохранения консоли открытой после завершения программы, взгляните на этот поток MSDN.

вероятно, ваша IDE настроена на закрытие консоли после запуска CTRL+F5; фактически, "пустой проект" в Visual C++ 2010 закрывает консоль по умолчанию. Чтобы изменить это, сделайте так, как предложил модератор Microsoft:

пожалуйста, правильно щелкните имя проекта и перейдите на страницу свойства, разверните свойства конфигурации -> Компоновщик -> система, выберите консоль (/SUBSYSTEM:CONSOLE) в раскрывающемся списке подсистема. Потому что по умолчанию пустой проект не указывает его.


обычно я просто ставлю точку останова на main()закрывающая фигурная скобка. Когда конец программы достигается любыми средствами, точка останова ударит, и вы можете ALT-Tab в окно консоли для просмотра вывода.


Почему бы просто не запустить программу с консоли, т. е. запустить программу из cmd.exe, если вы используете Windows. Таким образом, окно остается открытым после завершения программы.

[EDIT]: когда я использую KDevelop4, есть полноценный экземпляр Bash (Linux CLI), работающий на вкладке в нижней части IDE. Именно это я и использую в подобных обстоятельствах.


вызов cin.get(); 2 раза:

    //...
    cin.get();
    cin.get();
    return 0
}

перед окончанием кода вставьте следующую строку:

system("pause");

это будет держать консоль, пока вы не нажмете клавишу.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;
    cout << "Please enter your first name followed by a newline\n";
    cin >> s;
    cout << "Hello, " << s << '\n';
    system("pause"); // <----------------------------------
    return 0; // This return statement isn't necessary
}

Если вы запускаете свой код из компетентной IDE, например Код::Блоки, IDE будет управлять консолью, которую он использует для запуска кода, сохраняя его открытым, когда приложение закрывается. Вы не хотите добавлять специальный код, чтобы держать консоль открытой, потому что это помешает ей работать правильно, когда вы используете ее для реального, вне IDE.


хорошо, я предполагаю, что вы находитесь в Windows, используя Visual Studio... почему? Ну, потому что если вы находитесь на какой-то ОС Linux, то вы, вероятно, будете запускать его с консоли.

в любом случае, вы можете добавить дерьмо в конец своей программы, как предлагают другие, или вы можете просто нажать сочетание клавиш Ctrl + клавишу F5 (запуск без отладки), и Visual Studio оставит консоль после завершения.

другой вариант, если вы хотите запустить отладочную версию и не добавить хрень ваш код, чтобы открыть окно консоли (Пуск -> Выполнить -> cmd) и перейдите в папку отладка выходной каталог. Затем просто введите имя исполняемого файла, и он запустит вашу отладочную программу в консоли. Затем вы можете использовать приложение Visual Studio для процесса или что-то еще, если вы действительно хотите.


Если вы действительно отлаживаете приложение в Visual C++, нажмите клавишу F5 или зеленый треугольник на панели инструментов. Если вы на самом деле не отлаживаете его (у вас нет установленных точек останова), нажмите Ctrl+F5 или выберите "пуск без отладки" в меню (обычно это меню отладки, которое, я согласен, сбивает с толку.) Это будет немного быстрее, и что более важно для вас, будет пауза в конце без необходимости изменения кода.

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


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

cin.get();

добавить следующие строки перед любым


для Visual Studio (и только Visual Studio) следующий фрагмент кода дает вам приглашение "ждать нажатия клавиши для продолжения", которое действительно ждет пользователя, чтобы нажать новая ключ явно, сначала промывкой входного буфера:

#include <cstdio>
#include <tchar.h>
#include <conio.h>

_tprintf(_T("Press a key to continue "));
while( _kbhit() /* defined in conio.h */ ) _gettch();
_gettch();

обратите внимание, что это использует tchar.h макрос должен быть совместим с несколькими "наборами символов" (как их называет VC++).


Я просто делаю это:

//clear buffer, wait for input to close program
std::cin.clear(); std::cin.ignore(INT_MAX, '\n');
std::cin.get();
return 0;

Примечание: очистка буфера cin и такое только необходимо, если вы использовали cin в какой-то момент ранее в вашей программе. Также использование std::numeric_limits:: max (), вероятно, лучше, чем INT_MAX, но это немного многословно и обычно не нужно.


использовать #include "stdafx.h" & system("pause"); так же, как код ниже.

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    std::cout << "hello programmer!\n\nEnter 2 numbers: ";
    int x, y;
    std::cin >> x >> y;
    int w = x*y;
    std::cout <<"\nyour answer is: "<< w << endl;
    system("pause");
}

подобная идея е ответ, просто минималистская альтернатива.

создайте пакетный файл со следующим содержимым:

helloworld.exe
pause

затем используйте пакетный файл.


#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{

    cout << "Press any key to continue...";
    getch();

    return 0;
}

Я не заметил, что кто-то еще разместил это так вот.


посмотрите, есть ли у вашей IDE флажок в настройках проекта, чтобы держать окно открытым после завершения программы. Если нет, используйте std::cin.get(); для чтения символа в конце основной функции. Однако не забудьте использовать только строчный ввод (std::getline) или иметь дело с оставшимися непрочитанными символами в противном случае (std:: ignore until newline), потому что в противном случае .get () в конце будет читать только мусор, который вы оставили непрочитанным ранее.


Это, кажется, работает хорошо:

cin.clear();
cin.ignore(2);

Если вы сначала очистите буфер, это не будет проблемой при чтении следующего. Почему-то cin.ignore(1) не работает, он должен быть 2.


все, что вам нужно сделать, установите переменную для x, а затем просто введите это перед возвращением 0;

cout<<"\nPress any key and hit enter to end...";
cin>>x;

вы даже можете объявить целое число в начале (скажем int a;) и поставить std::cin >> a; непосредственно перед возвращаемым значением. Поэтому программа будет продолжать работать, пока вы не нажмете клавишу и входите.


вы всегда можете просто создать пакетный файл. Например, если ваша программа называется helloworld.exe, некоторый код будет:

@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1

Я ставлю точку останова на последнем возврате 0 программы. Работает отлично.


просто

int main(){
    // code...
    getchar();
    getchar();
    return 0;
}

Я cin.get() и это работало, но в один прекрасный день мне нужно было использовать другой cin.get([Array Variable]) перед этим захватить строку ling с пустым символом в середине. так что cin.get() не удалось избежать закрытия окна командной строки. Наконец я нашел другой путь.: Нажмите сочетание клавиш Ctrl+клавишу F5 для открытия во внешнем окне, и Visual Studio больше не контролирует его. Просто спросит вас о закрытии после выполнения финальных команд.


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


вместо нажатия кнопки run нажмите CTRL и F5 одновременно, это даст вам нажать любую клавишу, чтобы продолжить сообщение. Или введите "(предупреждение используйте это только для тестирования не фактических программ, поскольку антивирусы этого не любят!!!!) "в конце вашей основной функции, но: (предупреждение используйте это только для тестирования не фактических программ, поскольку антивирусы не нравятся!!!!)


просто используйте cin.ignore () прямо перед возвратом 0; дважды

main()
  {
  //your codes 

  cin.ignore();
  cin.ignore();

  return 0;
  }

вот и все


если вы используете Windows, то вы можете сделать system("pause >nul"); или system("pause");. Он выполняет консольную команду для приостановки программы до нажатия клавиши. >nul предотвращает его от слова Press any key to continue....