Як не допустити негайного запуску програми консолі C ++?


193

Останнім часом я намагаюся вивчити C ++ на цьому веб-сайті . На жаль, кожного разу, коли я намагаюся запустити один із зразків коду, я бачу, що програма відкривається приблизно на півтори секунди, а потім негайно закривається. Чи є спосіб негайно зупинити програму, щоб я побачив плоди своїх зусиль?


5
Ви двічі клацніть виконуваний файл? Ви працюєте в Windows? Чому ви не працюєте з оболонкою Command і вводите команди так, як ви хочете, щоб вони виконувалися?
С.Лотт

8
@S Lott: Тому що якщо ти натиснеш кнопку "Перейти" в IDE, то не потрібно буде турбуватися з консоллю.
Біллі ONeal

4
Вам слід розглянути можливість отримання хорошої книги, з якої можна вивчити C ++. Веб-сайти є хорошими ресурсами, але не відповідають хорошому вступному тексту. Там в остаточний список книг C ++ тут: stackoverflow.com/questions/388242 / ...
Джеймс McNellis

6
@Billy Якщо натискання кнопки Go закриває програму після її завершення, ви використовуєте неправильний IDE.

2
На запитання та відповіді раніше тут: stackoverflow.com/questions/902261/… , хоча ця назва має кращу назву.
dmckee --- колишнє кошеня модератора

Відповіді:


121

Редагувати: Як справедливо зазначає Чарльз Бейлі в коментарі нижче, це не спрацює, якщо є буквені персонажі stdin, і дійсно немає хорошого способу обійти це. Якщо ви працюєте з доданим налагоджувачем, запропоноване рішення Джона Діблінга є, мабуть, найчистішим рішенням вашої проблеми.

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


Після закінчення mainфункції ви можете зателефонуватиstd::getchar();

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

Вам потрібно #include <cstdio>для getchar.


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

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

1
@James: Старий, а як же std::cin.ignore(std::cin.rdbuf()->in_avail());? Зрозумів з тут .
GManNickG

1
Один з варіантів я використовую багато є std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');з #include <limits>.
Xeo

5
Будь ласка, не робіть цього. :( Це не є функцією вашої програми для цього.
Гонки легкості в орбіті

138

Якщо ви використовуєте Visual Studio і ви запускаєте консольний додаток із IDE:

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


1
Запуск консолі з IDE? Як і чому ви це зробили?
CodyBugstein

1
Відмінно, спрацювало. Чому це не поведінка Visual Studio за замовчуванням?
Світильник

Я також думав, що це було так, і до сьогодні, коли я створив просту консольну програму, і описаний вище метод не працював :(
KansaiRobot

1
Чи є версія цього з налагодженням?
luckyging3r

109

Рішення від Джеймса працює для всіх платформ.

Крім того, Windowsви також можете додати наступне перед поверненням з mainфункції:

  system("pause");

Це запустить pauseкоманду, яка чекає, поки ви натиснете клавішу, а також відобразить приємне повідомленняPress any key to continue . . .


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

4
@Dave Van den Eynde: Це також досить поширене і стандартне в кодовому коді на DevCPP. +1
Біллі ONeal

4
@Dave, з іншого боку, дає зрозуміти, що це лише бодж для прикладу, тоді як std: getch може бути випадково залишений у реальному коді.
Мартін Бекетт

2
Це ідеально правильне рішення для тих, хто має Windows. Хоча це не ідеально, але це працює
thecoshman

Найпростіше, швидке рішення. Тільки те, що мені було потрібно
CodyBugstein

83

Якщо ви використовуєте Microsoft Visual C ++ 2010 Express Microsoft і стикаєтеся з проблемою, коли CTRL + F5 не працює для збереження консолі відкритою після завершення програми, перегляньте цю тему MSDN .

Ймовірно, ваш IDE встановлений для закриття консолі після запуску CTRL + F5; насправді "Порожній проект" у Visual C ++ 2010 закриває консоль за замовчуванням. Щоб змінити це, зробіть так, як запропонував модератор Microsoft:

Клацніть правою кнопкою миші назву проекту та перейдіть на сторінку Властивості, розгорніть Конфігураційні властивості -> Linker -> Система, виберіть Консоль (/ SUBSYSTEM: CONSOLE) у спадному підсистемі. Тому що за замовчуванням проект Empty не вказує його.


1
Що робити, якщо це не консольний додаток?
Джессі Пеппер

3
@ Mr.Underhill Це буде працювати лише у випадку запуску без налагоджувача (Ctrl + F5).
Джонатан Мее

Окрім того, що це єдине не хакерське рішення, це також єдиний спосіб бачити відбитки основних руйнівників об'єктів стека.
Понірос

20

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


14

Чому б просто не запустити програму з консолі, тобто запустити програму з cmd.exe, якщо ви використовуєте Windows. Таким чином вікно залишається відкритим після завершення програми.

[EDIT]: Коли я використовую KDevelop4, на вкладці внизу IDE працює повноцінний екземпляр Bash (Linux CLI). Що я використовую в таких умовах.


3
Тому що якщо ви використовуєте IDE, ви зазвичай не використовуєте консоль. Ви натискаєте, програма запускається, і все.
Біллі ONeal

3
Будь-який компетентний IDE буде тримати консоль на екрані, коли додаток припиняється - Код :: Блоки, наприклад, роблять саме це.

3
@nobugz: я зрозумів це. Щоб застати вікно навколо, вам потрібно мати / SUBSYSTEM: CONSOLE у командному рядку linker. У документації йдеться про те, що це за замовчуванням, якщо 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
але чому двічі ??
Madhawa Priyashantha

що робити, якщо нам потрібен інший cin.get () для отримання, наприклад, деякої рядки всередині масиву перед цим? У цьому сценарії це не працює.
QMaster

4

Якщо ви запускаєте свій код з компетентного IDE, наприклад, Code: Blocks , IDE керуватиме консоллю, яку він використовує для запуску коду, зберігаючи його відкритим, коли програма закривається. Ви не хочете додавати спеціальний код, щоб зберегти консоль відкритою, оскільки це не дасть їй нормально функціонувати, коли ви використовуєте її для реального, поза IDE.


3

Гаразд я здогадуюсь, що ви в Windows використовуєте Visual Studio ... чому? Ну тому що, якщо ви знаходитесь на якійсь ОС Linux, то, ймовірно, ви запускаєте її з консолі.

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

Ще один варіант, якщо ви хочете запустити версію налагодження, а не додавати лайно до свого коду, - це відкрити вікно консолі (Пуск -> Виконати -> cmd) та перейти до вихідного каталогу налагодження . Потім просто введіть ім'я виконуваного файлу, і воно запустить вашу програму налагодження в консолі. Потім ви можете використовувати вкладення 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 (); to _getch (); так як воно застаріло
ncesar

2

Якщо ви фактично налагоджуєте свою програму в Visual C ++, натисніть F5 або зелений трикутник на панелі інструментів. Якщо ви насправді не налагоджуєте це (у вас не встановлено точок перерви), натисніть Ctrl + F5 або виберіть "Пуск без налагодження" у меню (зазвичай це в меню налагодження, яке, я погоджуюся, заплутане.) Це буде трохи швидше, і що ще важливіше для вас, ви зробите паузу наприкінці, не змінюючи код.

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


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; не виконає, якщо я використовую цей код.
wernersbacher

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 :: ігноруйте до нового рядка), оскільки в іншому випадку .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.