Visual C ++에서 콘솔 창을 열어 두는 방법은 무엇입니까?


191

Visual C ++에서 시작하여 콘솔 창을 유지하는 방법을 알고 싶습니다.

예를 들어 다음은 일반적인 "hello world"응용 프로그램입니다.

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

내가 놓친 줄은 무엇입니까?


Amruth A. Pillai 코드에 "계속하려면 아무 키나 누르십시오"라는 메시지가 표시되지 않습니다.

간단한 std :: cout 호출로 직접 인쇄 할 수 있습니다.
Raúl Roa

5
제안 된 모든 솔루션의 단점은 디버깅 작업 중 어느 것도 작동하지 않으며 (Ctrl + F5는 여기서 실패) 응용 프로그램이 예기치 않게 중지 될 때 (주 리턴시 stdin에서 모든 중단 점 또는 읽기가 실패 함)입니다. 내가보고 싶은 것은 Eclipse 및 기타 IDE와 같은 IDE 내부 창입니다. 프로그램이 종료 된 후에도 출력을 stdout / stderr에 계속 표시합니다.
박사. Sybren

@sybren 허용되는 대답은 CTRL + F5에서 작동하며 디버깅 (F5)에서 작동하는 솔루션을 원하는 이유는 무엇입니까? 분명히 디버깅의 요점은 .. 디버그입니까? 디버깅 세션에서 프로그램 종료 후 콘솔을 일시 중지하면 어떤 이점이 있습니까?
JBentley

2
@JBentley Eclipse 및 기타 IDE를 사용하면 프로세스가 종료 된 후에도 프로그램의 출력을 읽을 수 있습니다. 특히 버그를 찾으려고 할 때 추가 이점이 있습니까? 또한 중단 점은 프로그램이 종료되는 위치를 아는 경우에만 작동하므로 화면에서 출력이 사라지는시기를 알기가 어려울 수 있습니다.
박사. Sybren

답변:


389

Ctrl+F5그냥 대신 프로젝트를 시작하십시오 F5.

Press any key to continue . . .프로그램이 종료 된 후 메시지 와 함께 콘솔 창이 열린 상태로 유지 됩니다.

Console (/SUBSYSTEM:CONSOLE)링커 옵션 이 필요 하며 다음과 같이 활성화 할 수 있습니다.

  1. 프로젝트를 열고 솔루션 탐색기로 이동하십시오. K & R에서 나와 함께 팔로우하는 경우 "솔루션"은 프로젝트 1 개 아래에 'hello'이며 굵게 'hello'도 있습니다.
  2. 'hello'(또는 프로젝트 이름이 무엇이든)를 마우스 오른쪽 버튼으로 클릭하십시오.
  3. 상황에 맞는 메뉴에서 "속성"을 선택하십시오.
  4. 구성 특성> 링커> 시스템을 선택하십시오.
  5. 오른쪽 분할 창의 "서브 시스템"특성에 대해 오른쪽 열의 드롭 다운 상자를 클릭하십시오.
  6. "콘솔 (/ SUBSYSTEM : CONSOLE)"을 선택하십시오.
  7. 적용을 클릭하고 작업이 완료 될 때까지 기다린 다음 확인을 클릭하십시오. ( "적용"이 회색으로 표시되면 다른 하위 시스템 옵션을 선택하고 적용을 클릭 한 다음 되돌아 가서 콘솔 옵션을 적용하십시오. 제 경험으로는 저절로 작동하지 않습니다.)

CTRL-F5와 서브 시스템 힌트는 함께 작동합니다. 그들은 별도의 옵션이 아닙니다.

( http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 에서 DJMorreTX 제공 )


36
디버깅없이 프로그램을 실행합니다. 디버그 및 일반 실행 모드 모두에서 작동하는 솔루션을 사용하는 것이 좋습니다.
스파 푸 파미 콘

3
이 솔루션을 makefile 프로젝트에서 사용할 수없는 사람은 Visual Studio의 버그로 인한 것입니다. 방금 수정 사항에 대한 답변을 게시했습니다.
JBentley

1
확인할 수 있습니다! 작동하지 않는 콘솔 앱이 있었으며 작동했습니다. 코드 cin.get(),getchar(), system("pause")나 다른 가비지로 코드를 변경할 필요가 없습니다 . 이 변경하면 작동합니다.
Callat

Ctrl + F5는 '디버깅없이 시작'을 의미합니다. 따라서 디버깅 할 때 이것을 사용할 수 없습니다. system("pause");코드 끝에 추가 하십시오. 의미가 있고 잘 작동합니다.
Milad

41

표준적인 방법은 cin.get()귀하의 반환 진술 앞에 있습니다.

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}

4
프로그램에서 이미 cout을 사용하고 있기 때문에 이미 처리했음을 알지만 std 네임 스페이스를 사용하는 것뿐만 아니라 #include <iostream>을 언급해야한다고 언급 할 가치가 있다고 생각합니다. std :: cin.get () .
Brian

7
이것은 작동하지만 Ctrl + F5는 특히 전역 객체 파괴 등을 추적 할 때 훨씬 좋습니다.
Ternary

8
의 경우 -1입니다 _tmain. cin.get()F5에 중단 점을 배치하거나 Ctrl F5를 사용 하는 대신 다른 -1로 투표했습니다 . 그러나 나는 단 하나의 downvote 만 허용됩니다.
건배와 hth. -Alf

8
@Cheers : 무엇이 잘못 되었나요 _tmain? 이것이 콘솔 하위 시스템을 대상으로하는 Windows 응용 프로그램을 작성하는 표준 방법입니다. 그 표준에서 벗어나는 것은 나쁜 습관입니다. 분명히 아무도 휴대용 코드에 대해 이야기하고 있지 않습니다. 질문은 Visual C ++라고 _tmain하며 샘플 코드에 나타나는 서명입니다. 이 종교를 포기할 때입니다. Windows는 기본적으로 "비표준"이며 해당 표준 을 따르는 데는 상당한 이유 있습니다.
코디 그레이

8
@CodyGray : 필자의 _tmain의견은 완전히 비표준 적 이며 (국제 C ++ 표준에는 일반이 필요함 main), Microsoft의 T매크로 체계를 사용하기 때문에 Windows 9x를 지원하는 데 필요한 복잡성과 복잡성이 없기 때문 입니다. 표준에서 벗어나는 것이 나쁜 습관이라고 생각되면 절대로 사용해서는 안됩니다 tmain. tmain트롤링이나 전문가의 경우 전체 무능 성을 표시하는 것을 제외하고는 을 사용하는 데는 정당한 이유가 없습니다 .
건배와 hth. -Alf

24

return줄에 중단 점을 둡니다 .

디버거에서 실행하고 있습니까?


15
프로그램 내에 여러 개의 출구 지점이있을 수 있으므로 대부분의 경우 어려움
volzotan

누락 된 DLL로 인해 프로그램이 시작되지 않을 수 있으며 중단 점에 도달하지 못함
Michael

18

다른 옵션은

#include <process.h>
system("pause");

Windows에서만 작동하기 때문에 이식성이 좋지 않지만 자동으로 인쇄됩니다.

계속하려면 아무 키나 누르십시오 ...


1
system ( "pause") 프로세서를 계속 실행하므로 사용해서는 안됩니다. cin.get () 또는 이와 동등한 것을 사용하십시오.
Krythic 2012

system에 선언되어 <stdlib.h>있습니다.
melpomene

@Krythic 방금 시도했지만 100 % CPU를 먹지 않았습니다. 내 프로세서 사용량은 항상 0 %-1 %였습니다. 재생할 수 없습니다.
melpomene

system ( "pause")은 cmd에서 "pause"명령을 호출하며, 항상 CPU를 사용하지 않습니다. 본질적으로 _getche ()와 같습니다.
Paul Stelian

7

makefile 프로젝트의 경우 Visual Studio의 버그로 인해 승인 된 솔루션이 실패합니다 (2012 년까지는 아직 테스트 중입니다-아직 테스트하지 않은 2013). 이 버그는 여기 에 자세히 설명되어 있습니다 .

makefile 프로젝트에서 프로그램 종료 후 콘솔을 일시 중지하려면 다음 단계를 수행하십시오 (2010-2012 이외의 버전에서는 다를 수 있음).

1) /SUBSYSTEM:CONSOLE링커로 전달하십시오. - 편집 : 아래를 참조하십시오.

2) 텍스트 편집기에서 프로젝트 파일 (.vcxproj)을 엽니 다.

3) 루트 <project>태그 안에 다음을 삽입하십시오.

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4) 솔루션에서 프로젝트를 다시로드하십시오.

5) 디버깅하지 않고 프로그램을 실행하십시오 (CTRL + F5).

편집하다:

아래 내 의견에 따라 링커 옵션 설정 /SUBSYSTEM:CONSOLE은 실제로 makefile 프로젝트와 관련이 없으며 MSVC 이외의 컴파일러를 사용하는 경우 반드시 가능하지는 않습니다. 중요한 것은 위의 3 단계에 따라 설정이 .vcxproj 파일에 추가된다는 것입니다.


전에 3 단계에 대해 들어 본 적이 없습니다. 당신은 그것이 필요하고 작동한다고 확신합니까?
Mooing Duck

@mooingduck 네, 여기 에 대한 귀하의 답변대한 나의 의견에 따라/SUBSYSTEM:CONSOLE 링커로 전달 하는 것이 실제로 관련이 없다는 것을 알게되었습니다 .3 단계가 모두 중요합니다. 내 대답은 makefile 프로젝트와 관련이 있음을 명심하십시오-makefile 프로젝트에서 IDE는 링커에 전달할 내용을 알 수있는 방법이 없으며 /SUBSYSTEM:CONSOLE옵션 이있는 컴파일러를 사용하지 않을 수도 있습니다. 콘솔 프로그램인지의 여부를 추적합니다. 이에 따라 답변을 수정하겠습니다.
JBentley

1
@mooingduck 또한 SCons를 빌드 시스템으로, MSVC 및 MinGW를 컴파일러로 사용하여 makefile 프로젝트에서이 솔루션을 직접 사용하고 있음을 확인할 수도 있습니다. 논 디버깅 모드에서 종료 후 IDE가 콘솔을 일시 중지하도록하는 다른 방법은 없습니다.
JBentley

1
@chuckleplant 나는 두려워하지 않습니다. 내 워크 플로우는 다른 방법으로 VS의 SCons를 호출했습니다. 처음에 VS makefile 프로젝트를 수동으로 생성하여 구성 변수를 SCons 스크립트 (예 : 32/64 비트, 컴파일러 이름, 릴리스 / 디버그)로 전달한 다음 나머지 논리를 처리했습니다. 이 설정에서는 프로젝트 파일을 변경할 필요가 없었으므로 SCons의 자동 생성 기능을 사용하지 않았습니다. 이후 Linux로 전환하여 더 이상 VS를 사용하지 않습니다. VS 버그이므로 필요한 추가 단계를 처리하기 위해 기능 요청을 SCons에 제출하는 것이 좋습니다.
JBentley

1
또는 프로젝트 파일이 생성 될 때마다 직접 Python 코드를 SCons 스크립트에 포함시킬 수 있습니다. VS 프로젝트 파일은 XML 표준을 준수한다고 생각하므로 누락 된 요소를 쉽게 추가 할 수 있으며 몇 줄의 코드 만 필요합니다. 여기 (Python 2.x의 경우) 또는 여기 (3.x) 에서 시작하는 것이 좋습니다 . 이 답변 은 흥미로울 수도 있습니다.
JBentley

4

콘솔 창이 닫히지 않도록 return 문 바로 앞 cin.get();또는 을 사용할 수 있습니다 cin.ignore();.


4

main의 마지막 중괄호에 중단 점을 두십시오.

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

그것은 나를 위해 작동하며 디버깅하지 않고 실행할 필요가 없습니다. 또한 중단 점에 도달하기 전에 소멸자를 실행하므로 소멸자에 인쇄 된 메시지가 있는지 확인할 수 있습니다.


3

_tmain메소드 의 닫는 괄호에 중단 점을 추가하기 만하면 됩니다. 이것은 더 쉬운 방법이며 디버그하기 위해 코드를 추가 할 필요가 없습니다.


2

의 끝 괄호에 중단 점을 배치하십시오 main(). 여러 return문장으로 도 트립됩니다 . 유일한 단점은exit() 가 걸리지 않는다는 것입니다.

디버깅하지 않는 경우 Zoidberg의 답변의 조언을 따르고 그냥 대신 Ctrl+로 프로그램을 시작하십시오 .F5F5


2

내 2 센트 :

선택 1 : 끝 부분에 중단 점 추가 main()

선택 2 :이 코드를 다음 바로 앞에 추가하십시오 return 0;.

std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

당신은 포함 할 필요가 <iomanip>에 대한std::numeric_limits


2

다음과 같이 0을 반환하기 전에 코드 끝에 system ( "pause")를 추가하십시오.

#include <stdlib.h>

int main()
{
    //some code goes here
    system("pause")
    return 0;
}



1

포함 #include <conio.h>하고 나서 줄 getch();바로 앞에 추가하십시오 return 0;. 그것은 내가 어쨌든 학교에서 배운 것입니다. 위에서 언급 한 방법은 내가 보는 것과 상당히 다릅니다.


2
-1 : 프로그램 자체를 일시 중지시키는 것이 일반적으로 잘못된 해결책이라는 사실 외에도 (대부분의 경우 릴리스 된 바이너리가 원하는 동작이 아니기 때문에) conio.h는 비표준 적이고 오래되었으며 C ++가 아닌 C 헤더! 불행히도 학교에는 많은 나쁜 프로그래밍 관행이 있습니다.
JBentley

테스트 중에 만 사용할 것으로 예상되지만 최종 버전에서 유지해야 할 것은 아닙니다. Windows를 코딩하는 경우 #include <conio.h> / _getch ();의 문제점은 무엇입니까? cin.get ()보다 빠르게 작성하고, 2 개의 키 (적어도 문자 + 입력)를 누르지 않아도되며 디버그에서만 또는 릴리스 모드에서만 작동하지 않습니다. 그럼 뭐가 문제 야?
Barnack

1

같은 문제가 있었다. _getch()return 문 바로 전에 사용하고 있습니다. 효과가있다.


특히 오래 전에 질문 / 답변 한 질문에 대해 코드에 예제와 설명을 추가 할 수 있습니다. 또한 답변은 몇 가지 이전 답변과 기능적으로 동일하며 기존의 다른 답변과 동일한 통화를 사용합니다.
Clockwork-Muse

0

(일부 옵션은 다른 이름으로 불릴 수도 있습니다. 영어 버전은 사용하지 않습니다)

"empty project"옵션으로 프로젝트를 만들 때 "empty project"대신 "Win32-console application"으로 프로젝트를 생성 할 때도 같은 문제가있었습니다. 이제 팝업 대화 상자에서 "계속"을 누른 후 "빈 프로젝트"옵션을 확인하고 확인을 누를 수 있습니다. 그 후에 CTRL + F5는 자동으로 닫히지 않는 콘솔을 엽니 다.


0

나는 같은 문제가 있었다. 내 응용 프로그램에는 여러 개의 exit () 지점이 있으며 정확하게 종료되는 위치를 알 수있는 방법이 없었으며 이에 대해 알았습니다.

atexit(system("pause"));

또는

atexit(cin.get());

이 방법으로 우리가 프로그램에서 나가는 곳이 어디든 중단됩니다.


에 대한 유효한 호출은 없습니다 atexit. atexit정수가 아닌 함수 포인터를 사용합니다.
melpomene

0

다른 옵션 :

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

메인에서 :

int main(int argc, char* argv[]) {
    MAINRET;
}

0

실제로 실제 솔루션은 프로젝트 템플릿 자체를 선택하는 것입니다. 이전 VS에서 Win32 콘솔 응용 프로그램을 선택하거나 프로젝트 이름을 먼저 입력 한 다음 Windows 바탕 화면 마법사를 두 번 클릭 한 다음 Win32 콘솔 응용 프로그램을 선택해야합니다. 그런 다음이 시점에서 빈 프로젝트를 선택하십시오. 그러면 추가 중지 지점 및 보류 코드를 추가하지 않고도 원래 질문자가 실제로 원하는 것을 할 수 있습니다. 나는이 문제를 겪었다. 대답은 MSDN 사이트에도 있습니다.


0

다음은 코드를 수정하지 않고 실행이 중지되는 방식에 관계없이 명령 창을 열어 두는 방법입니다.

Visual Studio에서 프로젝트 속성 페이지 -> 디버깅을 엽니 다. .

대한 명령 을 입력$(ComSpec)

들어 명령 인수 입력/k $(TargetPath) . 자신의 응용 프로그램에 인수를 추가하십시오.

이제 F5 또는 Ctrl-F5 는 새 창에서 Windows / System32 / cmd.exe 를 실행 하고 / k 는 실행이 완료된 후 명령 프롬프트가 열린 상태로 유지되도록합니다.

단점은 중단 점에서 실행이 중지되지 않는다는 것입니다.


0

이미 지적했듯이 Zoidbergs 솔루션은 일반적으로 원하지 않는 디버거를 연결하지 않습니다.

가장 좋은 옵션 imo는 도구> 옵션> 디버깅> 일반으로 이동하여 VS를 적절하게 구성하는 것입니다 (VS 2017부터). "디버깅 중지시 콘솔 자동 종료"(맨 아래)를 선택 취소합니다.


-1

keep_window_open ()을 넣을 수 있습니다. 반환하기 전에 여기에 하나의 예가 있습니다.

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}

2
keep_window_open ()은 어디에서 왔습니까? 예를 들어 어떤 헤더 파일과 라이브러리입니까?
Tom Goodfellow

자신이 한 std_lib_facilities.h에서하지만, 대부분의 시간은 당신은 포함이
SIFI의 Babionitakis을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.