C ++ 콘솔 응용 프로그램이 즉시 종료되지 않게하는 방법은 무엇입니까?


193

최근에 나는 이 웹 사이트 에서 C ++를 배우려고 노력했다 . 불행히도 코드 샘플 중 하나를 실행하려고 할 때마다 해당 프로그램이 약 0.5 초 동안 열린 다음 즉시 닫힙니다. 내 노력의 결과를 볼 수 있도록 프로그램이 즉시 닫히지 않도록하는 방법이 있습니까?


5
실행 파일을 두 번 클릭하고 있습니까? Windows에서 일하고 있습니까? 왜 명령 셸에서 작업하고 원하는대로 명령을 입력하지 않습니까?
S.Lott

8
@S Lott : IDE에서 "Go"버튼을 누르면 콘솔을 사용하지 않아도됩니다.
Billy ONeal

4
C ++을 배울 수있는 좋은 책을 얻는 것을 고려해야합니다. 웹 사이트는 훌륭한 자료이지만 훌륭한 소개 텍스트와 일치하지 않습니다. 여기에 확실한 C ++ 서적 목록이 있습니다 : stackoverflow.com/questions/388242/…
James McNellis

6
@Billy Go 버튼을 누르면 앱이 종료 될 때 앱이 닫히면 잘못된 IDE를 사용하고있는 것입니다.

2
질문 이전에 여기에 대답 stackoverflow.com/questions/902261/... ,이 더 나은 제목이 있지만.
dmckee --- 전 운영자 고양이

답변:


121

편집 : Charles Bailey가 아래 주석에서 올바르게 지적했듯이에 버퍼링 된 문자가 있으면 작동하지 않으며 stdin실제로 해결할 수있는 좋은 방법이 없습니다. 디버거가 연결된 상태에서 실행중인 경우 John Dibling의 제안 된 솔루션 은 아마도 가장 깨끗한 솔루션 일 것입니다.

즉, 나는 이것을 여기에두고 다른 누군가가 유용하다고 생각할 것입니다. 개발 중에 테스트를 작성할 때 빠른 해킹으로 많이 사용했습니다.


main기능 이 끝나면 전화를 걸 수 있습니다std::getchar();

이 문자는에서 단일 문자를 가져 와서 stdin"계속하려면 아무 키나 누르십시오"일종의 동작을 제공합니다 (실제로 "어떤 키를 누르십시오"메시지를 원하는 경우 직접 인쇄해야합니다).

당신은 필요 #include <cstdio>getchar.


15
getchar문제를 해결하지 못하거나 최소한 제한된 상황에서만 가능합니다. 에서 문자를 읽지 stdin만 stdin에서 이미 버퍼링 된 문자가있는 경우 프롬프트 인쇄 여부에 관계없이 대기하지 않고 프로그램이 계속 실행됩니다.
CB Bailey

1
@Charles : 좋은 지적입니다. until을 무시하면 \n부분 솔루션이지만 둘 이상의 입력 행이 버퍼링되는 경우 도움이되지 않습니다. 입력 스트림에서 모든 것을 지우는 표준 C ++ 방법을 모르겠습니다. :-/
James McNellis

1
@ 제임스 : 늙었지만 어떻 std::cin.ignore(std::cin.rdbuf()->in_avail());습니까? 여기 에서 가져 왔습니다 .
GManNickG

1
내가 많이 사용하는 옵션은 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');입니다 #include <limits>.
Xeo

5
이러지 마십시오. :(이 작업을 수행하는 것은 프로그램 기능의 일부가 아닙니다.
Lightness Races Orbit

138

Visual Studio를 사용 중이고 IDE에서 콘솔 응용 프로그램을 시작하는 경우 :

눌러 CTRL-F5를 응용 프로그램을 시작하고 당신이 어떤 키를 누를 때까지 콘솔 창을 열어 계속됩니다 (디버깅하지 않고 시작).


1
IDE에서 콘솔을 시작 하시겠습니까? 어떻게 그리고 왜 그렇게 하시겠습니까?
CodyBugstein

1
훌륭했습니다. 이것이 Visual Studio의 기본 동작이 아닌 이유는 무엇입니까?
Luminaire

또한 간단한 콘솔 프로그램을 빌드 할 때까지 오늘까지 그렇게하는 방법이라고 생각했는데 위의 방법은 효과가 없었습니다. (
KansaiRobot

1
이 버전 거기 디버깅은?
luckyging3r

109

James의 솔루션은 모든 플랫폼에서 작동합니다.

또는 함수 Windows에서 돌아 오기 직전에 다음을 추가 할 수도 있습니다 main.

  system("pause");

pause키를 누를 때까지 대기 하는 명령을 실행하고 멋진 메시지를 표시합니다.Press any key to continue . . .


2
Rube Goldberg 솔루션의 변형처럼 들립니다.
Dave Van den Eynde

4
@Dave Van den Eynde : 또한 매우 일반적이며 DevCPP의 상용구 코드에서 표준으로 제공됩니다. +1
Billy ONeal

4
반면에 @Dave는 이것이 예제의 단지 보지임을 분명히하지만 std : getch는 실수로 실제 코드에 남을 수 있습니다.
Martin Beckett

2
이것은 Windows 사용자에게 완벽하게 유효한 솔루션입니다. 이상적이지는 않지만 작동합니다
thecoshman

가장 쉽고 빠른 솔루션. 내가 필요한 것
CodyBugstein

83

Microsoft의 Visual C ++ 2010 Express를 사용하고 있고 프로그램이 종료 된 후 콘솔을 열어 두지 않고 CTRL + F5 와 관련된 문제가 발생 하면이 MSDN 스레드를 살펴보십시오 .

CTRL + F5 실행 후 IDE가 콘솔을 닫도록 설정되었을 수 있습니다. 실제로 Visual C ++ 2010의 "빈 프로젝트"는 기본적으로 콘솔을 닫습니다. 이를 변경하려면 Microsoft 중재자가 제안한대로 수행하십시오.

프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 특성 페이지로 이동하여 구성 특성-> 링커-> 시스템을 펼치고 서브 시스템 드롭 다운에서 콘솔 (/ SUBSYSTEM : CONSOLE)을 선택하십시오. 기본적으로 빈 프로젝트는이를 지정하지 않기 때문입니다.


1
콘솔 앱이 아닌 경우 어떻게합니까?
Jesse Pepper

3
@ Mr.Underhill 디버거없이 실행하는 경우 에만 작동합니다 (Ctrl + F5).
Jonathan Mee

해킹이 아닌 유일한 솔루션 일뿐만 아니라, 이것은 메인 스택 객체 소멸자에서 출력물을 볼 수있는 유일한 방법이기도합니다.
Poniros

20

나는 보통 main()닫는 중괄호 에 중단 점을 둡니다 . 프로그램의 끝에 도달하면 중단 점이 발생하고 콘솔 창으로 Alt-Tab하여 출력을 볼 수 있습니다.


14

Windows에서 Windows를 사용하는 경우 콘솔에서 프로그램을 실행하십시오 (예 : cmd.exe에서 프로그램 실행). 이렇게하면 프로그램이 끝난 후에도 창이 열려 있습니다.

[편집] : KDevelop4를 사용할 때 IDE 하단의 탭에서 실행되는 Bash (Linux CLI) 인스턴스가 있습니다. 이런 종류의 상황에서 내가 사용하는 것은 무엇입니까?


3
IDE를 사용하는 경우 일반적으로 콘솔을 사용하지 않기 때문입니다. 당신은 가서 프로그램을 실행하고 그게 끝입니다.
Billy ONeal

3
응용 프로그램이 종료되면 모든 유능한 IDE가 콘솔을 화면에 유지합니다. 예를 들어 Code :: Blocks는 정확하게 이것을 수행합니다.

3
@ nobugz : 알아 냈습니다. 창을 고정 시키려면 링커 명령 줄에 / SUBSYSTEM : CONSOLE이 있어야합니다. 설명서에 이것이 main정의되어 있으면 이것이 기본값 이지만, 명령 줄에서 명시 적으로 설정하지 않으면 VS는 응용 프로그램이 종료 될 때 창을 종료합니다. 한숨
James McNellis

2
@ 제임스 : 그것은 콘솔 창을 처음에 얻는 데 필요합니다. 결국 다른 방법이 아닌 WinMain () 대신 main ()이 필요합니다. 나는 조금 길을 잃었다 ...
Hans Passant

4
@nobugz : "Win32 콘솔 응용 프로그램"대신 "빈 프로젝트"에서 시작하면 프로젝트 속성에 하위 시스템이 명시 적으로 설정되지 않습니다. main프로젝트에서 정의하는 경우 링커는 기본적으로 CONSOLE 서브 시스템을 사용합니다. 디버깅하거나 실행할 때 콘솔 창이 나타납니다. 그러나 프로젝트 속성에서 CONSOLE을 하위 시스템으로 명시 적으로 지정하지 않으면 Visual Studio는 콘솔 창을 열어 두지 않습니다. 나는 항상 빈 프로젝트에서 시작하고 개별 프로젝트 속성을 거의 변경하지 않으므로 콘솔 창을 본 적이 없습니다. 혼란을 드려 죄송합니다
James McNellis

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 2016 년

예를 들어 배열 앞에 문자열을 가져 오기 위해 다른 cin.get ()이 필요한 경우 어떻게해야합니까? 이 시나리오에서는 작동하지 않습니다.
QMaster

4

Code :: Blocks 와 같은 유능한 IDE에서 코드를 실행 하면 IDE는 코드를 실행하는 데 사용하는 콘솔을 관리하여 응용 프로그램이 닫힐 때 코드를 열어 둡니다. 콘솔을 열어두기 위해 특수 코드를 추가하지 않으려는 경우 IDE 외부에서 실제로 사용할 때 콘솔이 올바르게 작동하지 않기 때문입니다.


3

좋아, Visual Studio를 사용하여 Windows를 사용하고 있다고 추측합니다. 왜 그렇습니까? 어떤 종류의 Linux OS를 사용하고 있다면 아마도 콘솔에서 실행하고있을 것입니다.

어쨌든 다른 사람들이 제안하는 것처럼 프로그램 끝에 쓰레기를 추가하거나 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.hWindows 고유의 헤더로 추가하고 모든 컴퓨터에서 사용하지 못할 수 있습니다 (또는 과도기 인 별도의 링크가 필요할 수 있음).
Yksisarvinen

일. getch ()를 변경해야했습니다. _getch (); 더 이상 사용되지 않기 때문에
ncesar

2

실제로 Visual C ++에서 응용 프로그램을 디버깅하는 경우 도구 모음에서 F5 또는 녹색 삼각형을 누르십시오. 실제로 디버깅하지 않는 경우 (브레이크 포인트가 설정되지 않은 경우) Ctrl + F5를 누르거나 메뉴에서 디버깅하지 않고 시작을 선택하십시오 (일반적으로 디버그 메뉴에 혼동됩니다). 더 중요한 것은 코드를 변경하지 않고도 마지막에 일시 중지됩니다.

또는 명령 프롬프트를 열고 exe가있는 폴더로 이동 한 다음 이름을 입력하여 실행하십시오. 그렇게하면 명령 프롬프트 실행이 완료되지 않고 출력을 볼 수 있습니다. 이 두 가지 방법을 모두 선호하는 것처럼 앱을 종료하는 코드를 추가하는 것이 좋습니다.


2

프로그램 끝에 다음을 추가하십시오. 어떤 형태의 사용자 입력을 캡처하려고 시도하므로 콘솔이 자동으로 닫히지 않습니다.

cin.get();

2

어떤 전에 다음 줄을 추가 exit()기능 또는 이전 return에 S 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있습니다.
melpomene

1

유사 아이디어 예치 대답, 단지 최소한의 대안.

다음 내용으로 배치 파일을 작성하십시오.

helloworld.exe
pause

그런 다음 배치 파일을 사용하십시오.


1

간단히

#include <cstdio>

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

어떤 이유로 프로그램을 실행할 때 보통 stdin에 이미 getchar를 사용하여 읽을 수있는 문자가 1 개 있습니다. 따라서 첫 번째 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
이것은 질문에 대한 답변을 제공하지 않습니다. 작성자의 의견을 비판하거나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. 언제든지 자신의 게시물 에 댓글 수 있으며 평판 이 충분 하면 게시물댓글 수 있습니다 .
Ravi Dhoriya ツ

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

반환 0 직전에 cin.ignore ()를 사용하십시오. 두번

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;있습니다. 따라서 프로그램은 키를 누르고 입력 할 때까지 계속 실행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.