시스템 ( "일시 정지"); 왜 틀렸어?


131

내가 이해하지 못하는 질문이 있습니다.

이 명령 system("pause");은 프로그램을 일시 중지하고 키보드 입력이 계속 될 때까지 기다리는 방법으로 새로운 프로그래머에게 배웁니다. 그러나 그것은 많은 베테랑 프로그래머들에 의해 다양한 각도에서 수행되어서는 안되는 것으로 찌푸린 것처럼 보입니다.

어떤 사람들은 사용하는 것이 좋다고 말합니다. 어떤 사람들은 방에 갇혀 있고 아무도보고 있지 않을 때만 사용해야한다고 말합니다. 어떤 사람들은 그들이 개인적으로 당신의 집에 와서 그것을 사용하면 당신을 죽일 것이라고 말합니다.

저는 공식적인 프로그래밍 교육을받지 않은 새로운 프로그래머입니다. 나는 그것을 사용하도록 배웠기 때문에 그것을 사용합니다. 내가 이해하지 못하는 것은 그것이 사용해야 할 것이 아니라면 왜 그것을 사용하도록 가르쳐 졌는가? 아니면 반대로, 결국 그렇게 나쁘지 않습니까?

이 주제에 대해 어떻게 생각하십니까?



5
분명히 사람들은 정말로 효율적이기 위해 일시 ​​중지하라는 전화를 좋아합니다. 즉, "서둘러!"
리 루비 에르

63
일반적으로 교사가 나쁜 프로그래머이기 때문에 당신은 그것을 배웠다
느릅 나무

좋은 질문에 대한 다음 조언을 읽으십시오 : [질문 하는 방법 ], [완벽한 질문 작성 ].
Adi Inbar

9
@wich 완전히 말도 안됩니다.
Michael Chourdakis

답변:


85

실제로 프로그래밍 학습과는 관련이 없지만 IDE / OS의 기능을 둘러싼 플랫폼 별 해킹이기 때문에 눈살을 찌푸 렸습니다 .Visual Studio에서 시작된 콘솔 창은 프로그램 실행이 완료되면 닫힙니다. 새로운 사용자는 그의 새로운 프로그램의 결과를 볼 수 없습니다.

System ( "pause")에서 Bodging은 Windows 명령 줄 "pause"프로그램을 실행하고 프로그램 실행을 계속하기 전에 프로그램이 종료 될 때까지 기다립니다. 콘솔 창은 열려있어 출력을 읽을 수 있습니다.

더 나은 아이디어는 끝에 중단 점을두고 디버그하는 것이지만 다시 문제가 있습니다.


6
Visual Studio는 디버깅 유무에 관계없이 두 가지 모드로 프로그램을 실행할 수 있습니다. 디버깅 모드에서 실행하면 첫 번째 중단 점에서 중지됩니다. 정의 된 것이 없으면 프로그램을 실행하고 콘솔을 닫습니다. 따라서 콘솔 프로그램을 중지하려면 중단 점을 설정하거나 디버깅하지 않고 실행하는 것이 좋습니다. 그러면 프로그램이 실행되고 콘솔이 중지됩니다.
Ivan Mesic

이것은 Visual Studio의 기능 일뿐만 아니라 Windows에서 콘솔 프로그램을 실행하는 경우 (즉, 명령 프롬프트를로드하여 실행하는 것이 아니라) 실행이 끝나면 닫힙니다.
JBentley

2
−1 Re“프로그램 실행이 완료되면 Visual Studio에서 시작된 콘솔 창이 닫힙니다.”프로그램이 디버거에서 실행될 때만 해당됩니다. Re는 "Windows 명령 줄"일시 중지 "프로그램을 실행합니다. 해당 사항은 없습니다 ( pause내부 명령 임 cmd.exe). 더 나은 아이디어 목록도 심각하게 부족합니다.
건배와 hth. -Alf

이 답변은 이것이 해결 방법이라는 측면을 다루는 유일한 답변이라고 생각합니다. 프로그램 출력을 읽기 전에 터미널 창을 닫는 특정 실행 환경의 동작을 해결합니다. 당신이해야 할 일은 그 환경을 해결하는 것입니다. 그렇게 할 수없는 경우,이 해결 방법을 사용하십시오. IsDebuggerPresent()true를 반환하고이 해결 방법을 올바르게 문서화 한 경우에만 가능 합니다 ( "이 코드는 왜 여기에 있습니까?").
Ulrich Eckhardt

43

느리다. 플랫폼에 따라 다릅니다. 안전하지 않습니다.

첫째 : 무엇을 하는가. "시스템"을 호출하는 것은 문자 그대로 Windows 명령 프롬프트에 명령을 입력하는 것과 같습니다. 응용 프로그램에서 이러한 호출을 수행하는 데는 많은 설정과 해체가 있으며 오버 헤드는 어리 석습니다.

"일시 정지"라는 프로그램이 사용자의 PATH에 배치되면 어떻게됩니까? system ( "pause")를 호출하면 "pause"라는 프로그램 만 실행됩니다 ( "pause"라는 실행 파일이 없어야합니다!).

_getch를 사용하는 "Pause ()"함수를 작성하십시오. 물론 _getch는 플랫폼에 따라 다릅니다 (참고 : "conio.h"에 정의되어 있음). 그러나 system()Windows에서 개발할 때보 다 훨씬 좋으며 동일한 효과가 있습니다 (텍스트를 제공하는 것은 귀하의 책임 임) cout 정도).

기본적으로 두 줄의 코드를 추가하고 한 줄에 훨씬 더 유연한 메커니즘을 추가 할 수있을 때 왜 이렇게 많은 잠재적 인 문제가 발생합니까?


61
누군가가 플랫폼 의존성에 대해 불평을 위해, 확실히 제안 이상한 것 같다 _getch, 특히 표준 C ++에서 제공하는 경우 getchar.
paxdiablo

33
나는 인간과의 상호 작용에 대한 오버 헤드를 계산하는 데 약간의 아이러니를 느낀다)
ShPavel

1
@Spagpants : 아마도 사람으로부터 입력을받는 것과 사람에서 이미지와 소리 생성하는 것의 차이점을 이해하지 못할 수도 있습니다.
yzt

1
@ Cheersandhth.-Alf-흠? 8 년 전에이 글을 썼을 때 프로젝트의 실행 파일 이름이 "pause"이고 무한 루프 상태가 되었기 때문에 'system ( "pause")'로 인해 발생한 문제의 디버깅을 마쳤습니다. 내 요점이 여전히 서 있는데 왜 내가 틀렸다고 말하는지 잘 모르겠습니다.

2
@paxdiablo getchar에는 입력이 필요하고 Enter를 누르십시오. _getch는 키가 무엇이든 키를 누르기 만하면됩니다. 리눅스에서 _getch를 에뮬레이트하려면 콘솔 모드를 변경하고 기본값으로 다시 변경하려면 5-6 줄의 코드가 필요합니다. 동일하지 않으며 다른 일을합니다. getchar는 _getch를 대체하지 않습니다.
Barnack

29
  • 느리게 : 간단한 조작을 위해 불필요한 Windows 코드와 별도의 프로그램을 많이 뛰어 넘어야합니다.
  • 휴대용이 아님 : 일시 정지 프로그램에 따라 다름
  • 좋은 스타일이 아님 : 시스템 호출은 실제로 필요한 경우에만 수행해야 합니다.
  • 더 많은 타이핑 : System ( "pause")가 getchar ()보다 깁니다

간단한 getchar ()는 잘 작동합니다.


26

system("pause");Ungood Practice ™를 사용하면

  • 완전히 불필요 합니다.
    Visual Studio에서 프로그램을 실행할 때 프로그램의 콘솔 창을 계속 열어 두려면 Ctrl+ F5를 사용 하여 디버깅하지 않고 프로그램을 실행하거나의 마지막 오른쪽 괄호 }에 중단 점을 배치하십시오 main. 따라서 Visual Studio에는 아무런 문제가 없습니다. 물론 명령 줄에서 실행할 때 전혀 문제가 없습니다.


  • 커맨드 라인에서 프로그램을 실행할 때 문제가되고 성가시다 . 대화식 실행을 위해서는 목적에 상관없이 마지막에 키를 눌러야합니다. 그리고 pause매우 원치 않는 일부 작업의 자동화에 사용하기 위해 !

  • 휴대용이 아닙니다.
    유닉스 랜드에는 표준 pause명령 이 없습니다 .

pause명령은 내부 cmd.exe명령이며 적어도 하나의 다른 답변에서 잘못 주장 된 것처럼 무시할 수 없습니다. 즉, 보안 위험이 아니며 AV 프로그램이 그것을 진단한다고 주장하는 것은 명령을 재정의하는 주장과 마찬가지로 모호합니다 (결국 C ++ 프로그램 호출 system은 명령 해석기가 할 수있는 모든 것을 할 수있는 위치에 있습니다. 더). 또한 이러한 일시 중지 방법은 일반적인 C ++ 프로그래밍 표준에 의해 매우 비효율적이지만 초보자 프로그램의 끝에서는 전혀 중요하지 않습니다.

따라서이 전에 답변의 무리에 대한 주장은 정확하지 않으며, 당신이 사용하지 말아야하는 주된 이유 system("pause") 또는 의 끝에서 다른 대기 명령main위의 첫 번째 요점입니다. 그것은 완전히 불필요하며 절대적으로 목적이 없습니다. , 그것은 매우 바보입니다.


1
때로는 빠른 테스트를 위해 Ungood Practice ™가 필요합니다. "우리는"빠르고 더러운 "
Michael Haephrati

22

요약하면 cin.get ()과 같은 간단한 것을 사용할 수있을 때 프로그램 실행을 일시 중지하고 시스템 호출을 수행하고 불필요한 리소스를 할당해야합니다. 사람들은 System ( "PAUSE")을 사용합니다. 프로그램이 Enter 키를 누를 때까지 기다리면 출력을 볼 수 있기 때문입니다. 프로그램이 입력을 기다리 길 원한다면, 플랫폼 간 및 요구 사항이 적은 기능이 내장되어 있습니다.

기사 에서 추가 설명 .


와우, 다시! 너 여기 살아? 어쨌든, 고마워, 나는 약간의 독서를 할 것이다. 그동안이 문제에 대해 어떻게 생각하십니까?
Faken

몇 년 전에 C를 처음 시작했을 때도 같은 질문이 있었고 같은 기사를 가리 켰습니다. 개인적으로 getchar ()를 사용합니다.
John T

Ho wow ... 나는 C ++을 한동안하지 않았지만 그래 .. 같은 결과를 얻는 더 좋은 방법이있다
Newtopian

16

다음 std::cin.get()에서 사용할 수 있습니다 iostream.

#include <iostream> // std::cout, std::cin
using namespace std;

int main() {
   do {
     cout << '\n' << "Press the Enter key to continue.";
   } while (cin.get() != '\n');

   return 0;
}

게다가 system('pause')느리고 필요하지 않은 파일이 포함되어 stdlib.h있습니다.. 플랫폼에 따라 다르며 실제로 '가상'OS를 호출합니다.


3
System("pause")1 학년 프로그래밍 과정에서 사용 하는 법을 배웠지 만 Mac에서 프로그램을 실행할 수 있기를 원했기 때문에에 대해 배워야했습니다 cin.get().
daviewales

10

휴대용이 아니기 때문입니다.

pause

Windows / Dos 전용 프로그램 이므로이 코드는 Linux에서 실행되지 않습니다. 또한, system일반적으로 다른 프로그램을 호출 할 수있는 아주 좋은 방법으로 간주되지 않는다 - 그것은 일반적으로 잘 사용하는 것입니다 CreateProcess이나 fork또는 비슷한.


4

다른 답변에 나열된 것처럼 이것을 피할 수있는 많은 이유가 있습니다. 그것은 모두 나머지를 무질서하게 만드는 한 가지 이유로 요약됩니다. 이 System()기능은 본질적으로 안전하지 않거나 신뢰할 수 없으므로 필요한 경우가 아니면 프로그램에 도입해서는 안됩니다.

학생 과제의 경우이 조건이 충족되지 않았 으므로이 방법을 호출하면 프로그램을 실행하지 않고도 과제가 실패합니다. (이것은 처음부터 명확 해졌습니다.)


4

나를 위해 일반적으로 이유없이 종료하기 전에 기다리는 것은 의미가 없습니다. 작업을 수행 한 프로그램은 종료하고 리소스를 제작자에게 다시 넘겨 줘야합니다.

또한 근무일 이후 어두운 구석에서 조용히 기다리지 않고 누군가가 어깨를 기울이기를 기다립니다.


7
이것은 어리석은 대답입니다. "작업을 수행하는"프로그램의 일부는 작업 결과를 사용자에게 표시합니다. 따라서 사용자가 완료되었음을 알리기 전까지는 끝나지 않아야합니다. 결과를 표시 한 후 1 초 후에 사용자 화면에서 사라지는 프로그램은 쓸모가 없습니다.
JBentley

1
@ JBentley : 결과를 표시 한 상황에 대해 이야기했습니다 . 결과를 표시하기 위해 신호, 인터럽트, 타이머, 터미널의 스크롤 백, 파일과 같은 적절한 패턴이 있습니다. system("pause")그 자체로는 아무것도 표시되지 않습니다. 명령 행에서 호출되지 않고 너무 빨리 닫히는 명령 행 인터페이스 프로그램이 잘못 호출되고 옵션 system("pause")이 잘못되어 잘못 호출 된 프로그램을 피하기 위해 사용 하는 것은 실제로 올바른 일이 아닙니다.
Sebastian Mach

1
나는 단지 상상 의미 cat, less, vi, OpenOffice, Mathematica, GNU Octave, 그들이 무엇을 사용하려는 경우 system("pause")? 그것은 성가시다.
Sebastian Mach

2
그렇습니다. 성가신 일이지만, 지금은 문제에 대해 구체적으로 이야기하는 system("pause")반면, 답변은 "종료하기 전에 대기"에 대해 이야기하는 것입니다. 이는 훨씬 더 일반적인 개념입니다. 사용자가 제공 한 많은 예제는 사용자가 프로그램에 종료를 알릴 때까지 실제로 "종료하기 전에 대기"합니다. 나는 그것이 그것을 system("pause")달성하는 좋은 방법이 아니며 더 나은 해결책이 있다는 것에 동의 하지만 그것은 당신의 대답이 아닙니다.
JBentley

1
@JBentley 아, 절대적으로 : 만약 지연 / 대기 / 프롬프트가 프로그램의 의미론의 일부라면, pause멀리!
궤도에서 가벼움 레이스

3
system("pause");  

Windows API의 일부이므로 다른 운영 체제에서 작동하지 않기 때문에 잘못되었습니다.

C ++ 표준 라이브러리의 오브젝트 만 사용하십시오. 더 나은 해결책은 다음과 같이 작성하는 것입니다.

cin.get();
return 0;

그러나 cin코드에 다른 파일이 있으면 문제가 발생할 수도 있습니다 . 각각의 뒤에 공백 문자 인 또는 을 cin탭하게 됩니다. 이 문자를 무시하고 버퍼 영역에 남겨두고이 문자를 유지합니다. 따라서 프로그램 제어가 라인에 도달 하고 콘솔이 닫히고 결과를 볼 수 있습니다. 이를 해결하기 위해 다음과 같이 코드를 작성합니다. Enter\ncincin.get()return 0

cin.ignore();  
cin.get();  
return 0;

약간 오해의 소지가 있습니다. system()표준이며 MS Windows에만 국한되지 않습니다. 그러나 pause쉘 명령은 DOS 유산이며 일반적으로 거기에서만 발견됩니다.
Ulrich Eckhardt

1

사용하지 말아야 할 한 가지 이유는 다음과 같습니다. 보안 위협이기 때문에 프로그램을 다른 컴퓨터로 전달하는 경우 Windows에서 실행되는 대부분의 바이러스 백신 프로그램을 열화시킵니다. 프로그램이 단순한 cout << "hello world\n"; system("pause"); It 's 리소스 로만 구성되어 있어도 안티 바이러스는 위협으로 간주되는 cmd 명령에 액세스 할 수 있습니다.


-1

전문가의 시스템 사용 ( "PAUSE"); 프로그램의 작은 부분을 만드는 것은 직접 디버깅하기위한 것입니다. 각 프로세스 전후에 변수의 결과를 얻기 위해이 변수를 사용하는 경우 변수가 올바르게 작동하는지 확인하는 데 사용합니다.

나머지 솔루션으로 테스트하고 완전히 스윙 한 후에는 이러한 라인을 제거해야합니다. 사용자 정의 알고리즘을 테스트하고 원하는 결과를 위해 올바른 순서로 작업을 수행하고 있는지 확인하는 것이 좋습니다.

테스트 한 후 제대로 작동하는지 확인한 후에는 응용 프로그램에서이 기능을 사용하고 싶지 않습니다. 그러나 발생하는 모든 작업을 추적 할 수 있습니다. 최종 사용자 앱에는 전혀 사용하지 마십시오.


-3

그것은 모두 스타일의 문제입니다. 디버깅에는 유용하지만 프로그램의 최종 버전에서는 사용하면 안됩니다. 시스템을 발명 한 사람들 ( "일시 정지")이 자주 사용될 것이라고 예상했기 때문에 메모리 문제는 중요하지 않습니다. 또 다른 관점에서, 컴퓨터는 우리가 어쨌든 컴퓨터에서 사용하는 다른 모든 것에 대해 메모리에 스로틀되어 동적 메모리 할당과 같은 직접적인 위협을 일으키지 않으므로 코드 디버깅에는 권장하지만 다른 것은 없습니다.


6
시스템 ( "일시 정지")을 발명 한 사람들이 자주 사용될 것이라고 예상하고 있었기 때문에 메모리 문제는 중요하지 않습니다. 아무도 이것을 "발명" pause하지 않았으며 DOS 배치 프로그램에서 사용하도록 설계되었지만 결코 이와 같은 방식으로 사용되도록 의도 된 적이 없습니다. 더욱이 누군가가 문구를 입력하기에 충분히 미치기 전에는 더 나은 대안이있었습니다 system("pause");.
wich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.