2009-07-23 10 views
15

콘솔 프로그램을 컴파일 한 후 콘솔 창은 실행 후 즉시 닫힙니다. 열린 상태로 유지하는 가장 좋은 방법은 무엇입니까? Google로드가 검색되었지만 걱정하지 않아도되는 codeblocks에 익숙하지만 Visual Studio를 조금씩 사용하고 VS를 사용하여 콘솔을 닫습니다. interwebz에는 오픈 방식을 유지하는 몇 가지 다른 방법이 있지만, 대부분은 나쁜 코딩 기술이라고 읽었습니다. 모든 사람이 선호하는 방법은 무엇입니까?콘솔 닫기 문제를 해결하는 모범 사례는 무엇입니까?

답변

5

cin는 건망증이 도출하기 위해 심하게 우아하지만 간단합니다 : 당신은 문자/* 편집 *을 입력/Enter 키를 누르 때까지 열려있는 창을 보유하고

{ 
    char c; 
    std::cin >> c; 
} 

.

std::cin.get() 당신이 얼마나 쉽게 익숙해 지 느냐에 따라 "쾅쾅 소리가 나지 않았 으면 좋겠어!"라는 위험이 있습니다. 2 키 입력보다 operator>>(istream &).

둘 다 프로그램 접근 가능 방식으로 입력 한 문자의 값을 반환한다는 점에서 두 문자가 모두 다르다. 따라서 빈번히 발생하지 않는 한 하나의 kludge가 다른 문자로 연결되는 경우 무엇을 기반으로 switch 문을 작성할 수 있습니다. (예를 들어) 즉시 종료하고, 로그에 값을 쓰고, 다시 실행하십시오.

+3

std :: cin.get()은 같은 효과를 가지며 더 짧습니다. –

+3

문자를 얻을 수있을 때까지 창을 보유합니다. 어느 것이 버퍼가 플러시 될 때까지 (cin은 버퍼링된다). 그래서 사용자가 엔터를 누르거나 많은 문자를 입력하고 버퍼를 채울 것을 요구합니다. –

+0

@ robson3.1415, @martin 편집을 참조하십시오 :-) –

2

매우 일반적인 것은 주 응용 프로그램 코드가 닫힌 후 콘솔에서 키를 읽는 코드를 입력하는 것입니다 . 독서 된 키 스트로크는 버려지고 콘솔은 열리게됩니다.

꽤 귀찮은 것은 아니지만 - 자주 디버깅 정의에 포함 시키므로 디버깅하는 동안 콘솔이 열려 있습니다. 릴리스 중에는 대개 VS 내부에서 실행되지 않으며 명령 줄에서 실행하면 더 이상 문제가되지 않습니다.

+0

나는 디버그 #define 아이디어를 좋아합니다. 중단 점보다 확실히 좋습니다. – AShelly

13

항상 디버거에서 실행되므로 return 문에 중단 점을 main()에서 설정하십시오.

디버거는 가장 좋은 친구이며 모든 기회에 이점을 사용하도록 배우고 (조기에 배우십시오).

+1

내가 이것을 할 때마다, 나는 끊임없이 자신이 crt0.c에 들어가는 것을 발견한다. 그것은 정말로 짜증 스럽다. – AShelly

6

그 것이다 프로그램을 실행하기 위해 당신이 할 수있다, 또는 ... 어떤이 콘솔 프로그램을 실행의 예상 방법이 될 것입니다, 콘솔에 약간의 배치 파일을

을 프로그램을 실행

REM batch file to launch program 
yourprogram.exe 
PAUSE 

PAUSE cmd.exe 명령은 사용자에게 아무 키나 누르라는 메시지를 표시합니다.

+9

사실 꽤 쉽습니다. VS에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Properties를 선택하십시오. 디버그 섹션에서 외부 프로그램을 시작하도록 지시 할 수 있습니다. 이 경우 응용 프로그램을 시작하는 배치 파일이됩니다. –

4

나는 당신에게

Press any key to continue . . .

메시지를 제공하는 system("PAUSE");를 사용하는 경향이있다.

+1

이것은 생각할 수있는 특정 창이지만 작업이 완료됩니다. – DeusAduro

+0

당신은 맞습니다. Windows 만 그렇지만 Visual Studio에서이 문제가 발견되어 OK 일 것이라고 생각했습니다. – irh

+2

-1이 같은 시스템 호출을 사용하지 마십시오 – Patrick

0

전화 당신이 주요의 말에 반환하기 전에이 기능 :

void onEnd() 
{ 
    printf("Press any key to exit..."); 
    _getch(); 
} 
21

나는 비주얼 스튜디오를 사용하고 있는데 내가 Ctrl 키 + F5 키 입력을 사용하여 난 그냥 그것을 실행 디버깅을 필요로하지 않는 경우 –이며 콘솔이 닫히지 않습니다.

cin.get() 

가 나는 그것이 시스템보다 ("PAUSE") 적은 비용이 많이 드는 듣고 너무 POSIX 시스템에서 작동합니다

3

내가 사용합니다. 자세한 내용은 link입니다.

+4

비용이 많이 드는 것은 무엇이 있습니까? 코드의 핵심은 키를 누를 때까지 터미널 창을 계속 돌리는 것입니다. 'system ("PAUSE")가 얼마나 느린지를 예를 들어. 귀하의 반사 신경 ;-) –

3

무엇이든하는 유혹에 저항하십시오. 제대로 작동 한 명령 행 프로그램은 실행 종료 후 종료 코드를 통해 상태를보고합니다. 이를 통해 자동화 된 환경에서 스크립트 작성이 가능하고 '훌륭한 시민'이 될 수 있습니다. 대화식 환경에서도 왜 디버깅 환경 때문에 키 누르기를 강요해야합니까?

디버깅 대신 실행하면 Visual Studio는 응용 프로그램이 종료 된 후에도 일시 중지되는 콘솔 창을 열어 여전히 출력을 볼 수 있습니다. 디버그 할 때 동작이 다른 이유는 모르겠다. 아마도 중단 점을 사용할 수 있기 때문이다. 다양한 출력 단계에서 출력을 보려면 관련 출력 문 다음에 중단 점을 배치하거나 main 끝에서 여러 가지 출력을 볼 수있다. '예외 발생시 중지'옵션.

이유가 무엇이든, 디버깅 경험을 향상시키기 위해 내 응용 프로그램의 동작을 손상시키지 않아도되는 일은 결코 없었습니다.

+0

+1 동작의 차이에 대 한 디버깅. –

1

이 스레드의 "do not do that"응답이 잘림 보일 수도 있지만 상당히 합리적입니다. 내가 잘 실행하는 데 사용되는 gtest 스위트를 디버깅 중이기 때문에이 질문에 대해 일어 났지만 이제는 시작될 때 신비하게 충돌합니다. 콘솔에서 실행하면 "blah.exe가 작동을 멈췄다"는 대화 상자가 나타납니다. 그러나 디버거에서 실행하면 콘솔이 일시적으로 팝업되고 사라지고 프로그램은 0 상태로 종료됩니다.

나는이 행동의 차이가 얼마나 이상했는지 생각해 봤어야했는데, 대신 나는 "어, 남자 --- 그 콘솔 창을 켜서 그대로 말하면 볼 수 있습니다."라고 생각했습니다. 권리?

내가 작업하고있는 머신 (내 동료)이 '--gtest_filter = * testMsg *'로 설정된 디버거에 대한 '명령 인수'를 가지고있는 것으로 나타났습니다. 나는 곧바로 이것을 알아 차렸다. 그러나 필자는 필터에 맞는 모든 테스트가 최근 커밋에서 이름이 바뀌 었음을 알지 못했다. 그래서 디버거에서 시작할 때 gtest는 실행할 테스트를 찾지 못하고 단순히 종료되었습니다. 내 인생의 또 다른 90 분 나는 결코 돌아 오지 않을 것이다. (-_-) 무릎 덩어리 반응으로 문제를 해결하기 위해 콘솔 창을 열어야한다고 생각하지 않았다면이 타르 아기를 훨씬 더 버렸을 수도 있습니다 ...

관련 문제