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


193

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


5
Вы дважды щелкаете по исполняемому файлу? Ты работаешь в винде? Почему вы не работаете из командной оболочки и вводите команды так, как вы хотите, чтобы они выполнялись?
S.Lott

8
@ S Lott: потому что если вы нажмете кнопку «Перейти» в вашей IDE, вам не нужно беспокоиться о консоли.
Билли Онил

4
Вы должны подумать о том, чтобы получить хорошую книгу для изучения C ++. Веб-сайты являются хорошими ресурсами, но не подходят для хорошего вводного текста. Здесь есть
полный

6
@Billy Если нажатие кнопки «Го» закрывает приложение после его завершения, вы используете неправильную IDE.

2
На вопрос и ответ здесь ранее: stackoverflow.com/questions/902261/… , хотя у этого есть лучший заголовок.
dmckee --- котенок экс-модератора

Ответы:


122

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

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


В конце вашей mainфункции вы можете позвонитьstd::getchar();

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

Вам нужно #include <cstdio>для getchar.


15
getcharне решает проблему - или только в ограниченных обстоятельствах, по крайней мере. Он читает символ из stdin, но если в stdin уже есть буферизованные символы, программа продолжит работу без ожидания, независимо от того, печатаете ли вы приглашение или нет.
CB Bailey

1
@ Чарльз: Хороший вопрос. Игнорирование до \nявляется частичным решением, но не поможет, если буферизуется более одной строки ввода. Я не знаю стандартного C ++ способа очистить все от входного потока. : - /
Джеймс МакНеллис

1
@ Джеймс: Старый, но как насчет std::cin.ignore(std::cin.rdbuf()->in_avail());? Получил это отсюда .
GManNickG

1
Один вариант, который я использую много, std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');с #include <limits>.
Сео

5
Пожалуйста, не делай этого. :( Это не входит в функции вашей программы, чтобы сделать это.
Гонки легкости на орбите

138

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

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


1
Запуск консоли из IDE? Как и зачем ты это делаешь?
CodyBugstein

1
Отлично, это сработало. Почему это не стандартное поведение Visual Studio?
Светильник

Я также думал, что это был способ сделать это, до сегодняшнего дня, когда я
собираю

1
Есть ли версия этого с отладкой?
luckyging3r

109

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

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

  system("pause");

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


2
Это звучит как вариант решения Рубе Голдберга.
Дейв Ван ден Эйнде

4
@Dave Van den Eynde: Это также довольно часто встречается и входит в стандартный шаблон кода в DevCPP. +1
Билли Онил

4
@Dave, с другой стороны, дает понять, что это просто пример для примера, тогда как std: getch может быть случайно оставлен в реальном коде.
Мартин Беккет

2
Это идеальное решение для тех, кто работает в Windows. Хотя он и не идеален, он работает
thecoshman

Самое простое, быстрое решение. Как раз то, что мне было нужно
CodyBugstein

83

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

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

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


1
Что если это не консольное приложение?
Джесси Пеппер

3
@ Mr.Underhill Это будет работать только при запуске без отладчика (Ctrl + F5).
Джонатан Ми

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

20

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


14

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

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


3
Потому что, если вы используете IDE, вы обычно не используете консоль. Вы нажимаете, программа запускается, и все.
Билли Онил

3
Любая компетентная IDE будет держать консоль на экране, когда приложение завершается - Code :: Blocks, например, делает именно это.

3
@nobugz: я понял это. Чтобы окно оставалось на месте, вам нужно иметь / SUBSYSTEM: CONSOLE в командной строке компоновщика. В документации сказано, что это значение по умолчанию, если mainоно определено, но если я не установлю его явно в командной строке, VS закроет окно при выходе из приложения. вздох
Джеймс МакНеллис

2
@James: это требуется, чтобы получить окно консоли в первую очередь. Это, в свою очередь, требует main () вместо WinMain (), а не наоборот. Я немного растерялся ...
Ганс Пассант

4
@nobugz: если вы начинаете с «Пустого проекта» вместо «Консольного приложения Win32», то подсистема явно не указана в свойствах проекта. Если вы определите mainв проекте, компоновщик по умолчанию использует подсистему CONSOLE. При отладке или запуске вы получите окно консоли. Однако, если вы явно не укажете CONSOLE в качестве подсистемы в свойствах проекта, Visual Studio не будет держать окно консоли открытым. Я всегда начинаю с пустого проекта и редко изменяю отдельные свойства проекта, поэтому никогда не видел, чтобы окно консоли зависало. Извините за путаницу
Джеймс МакНеллис

9

Перед концом вашего кода вставьте эту строку:

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
}

Также было напечатано «Нажмите любую клавишу для продолжения ...» для меня.
PapaHotelPapa

8

Звоните cin.get();2 раза:

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

6
но почему дважды ??
Мадхава Прияшанта

Что если нам понадобится еще один cin.get () для получения, например, какой-нибудь строки внутри массива перед этим? Это не работа в этом сценарии.
QMaster

4

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


3

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

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

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


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

using namespace std;

int main()
{

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

    return 0;
}

Я не заметил, кто-нибудь еще опубликовать это, так что вот оно.


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

Работает. просто нужно изменить getch (); _getch (); с тех пор как оно стало устаревшим
ncesar

2

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

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


2

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

cin.get();

2

Добавьте следующие строки перед любой exit()функцией или перед любой returns в main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");

Это не работает для меня, первая строка работает, но нажатие Enter ничего не делает
Qwertie

2

Для 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 ++).


2

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

//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, но это немного многословно и обычно не нужно.


Работает, но возврат 0; не будет выполняться, если я использую этот код.
Вернерсбахер

2

Используйте #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");
}

systemобъявлен в <cstdlib>, не stdafx.h.
Мельпомена

1

Аналогичная идея Yeh ответа, просто минималистская альтернатива.

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

helloworld.exe
pause

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


1

просто

#include <cstdio>

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

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


2
Пожалуйста, добавьте хотя бы краткое объяснение того, почему это решает проблему.
kaya3

0

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


0

Кажется, это хорошо работает:

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

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


1
2 иногда также недостаточно (когда в очереди еще несколько нажатий клавиш). Правильный способ - игнорировать столько символов, сколько в очереди. Чтобы с cin.rdbuf()->in_avail. Не какое-то магическое число, такое как 1 или 2.
Конрад Рудольф,

0

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

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

0

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


0

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


1
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его постом - вы всегда можете комментировать свои собственные посты, и, когда у вас будет достаточно репутации, вы сможете комментировать любой пост .
Рави Дхория ツ

1
Как это не дает ответ? Я нахожусь в точно такой же ситуации, как автор вопроса, и это помогает.
lierosk

0

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


0

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


0

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


0

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

main()
  {
  //your codes 

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

  return 0;
  }

вот и все


Я обычно делаю это примерно так. cin.ignore (); cin.get ();
aj.toulan

-1

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

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

-1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.