최상의 답변
C ++ 실격에 대한 제가 가장 좋아하는 질문 중 하나입니다. 전문가 .
물론 시스템 ( “PAUSE”)은 OS 셸을 만들고 “PAUSE”명령을 실행하도록하는 것을 의미합니다.
사실 보안 문제가 아닌 Windows에서만 작동합니다. “PAUSE “는 외부 프로그램을 호출하지 않는 쉘 내부 명령이기 때문입니다 (시스템 쉘 자체가 해킹되지 않는 한… 그러나 다른 문제가 있습니다.)
윈도우에서는 큰 “성능 문제”도 아닙니다. CMD.EXE의 이미지는 이미 RAM에 있고 CMD 데이터 세그먼트는 매우 작으며… … 일시 중지를 요청합니다 (가능한 빨리 실행하지 마십시오!)
다른 창 에서 작동하지 않음 (PAUSE 명령이 없을 수 있음) 보안 유출 (누군가 n 자신의 작업 대신 자신의 작업을 수행 할 PAUSE 프로그램을 만듭니다.
따라서 자신 만의 컴퓨터와 자신의 OS를 대상으로하지 않는 한 이식성이없고 위험 할 수도 있습니다.
p>
하지만 이제 문제는 “ 무엇을해야합니까 ?”가됩니다.
대답은… 잘못 입니다.… 작동 할 수 없기 때문입니다!
이유를 살펴 보겠습니다.
당신의 프로그램 cin
-두 개의 정수, 몇 가지 결과를 보여주고… 기다려야하나요 아니면 종료해야하나요?
가정하자 기다리시겠습니까? cin >> a
및 cin >> b
에 어떻게 대답합니까?
입력 내용은 다음과 같습니다.
12\n
34\n
이러한 f를 입력해야합니다. 콘솔 입력 모드를 종료해야하므로 .ing이 반환됩니다.
이제 cin >> a
는 “12”를 사용합니다. 반환 값은 버퍼에 남아 있습니다.
cin >> b
는 모든 숫자보다 첫 번째 공백이 아닌 공백까지 모든 공백 (반환 포함)을 사용합니다. “\ n34″를 소비합니다 (그리고 b = 34로 설정).
입력 버퍼에 f… ing이 돌아올 때까지 있습니다. 이제 모든 전문가가 실패!
-
cin.get()
를 사용하는 방법을 살펴 보겠습니다. 잘못된 : 한 문자를 읽고 계속합니다. 그리고 입력 버퍼에 문자가 하나 있으므로 일시 중지되지 않습니다 ! -
cin.ignore()
: 잘못된 : 여전히 버퍼에 f… ing이 반환됩니다. 당신은 그것을 무시하고 더 나아가십시오. 일시 중지 없음 .
어떻게해야할까요?
이 특정 샘플에서는 반환을 포함하여 버퍼에있는 모든 것을 무시하고 무시할 다른 것을 요청해야합니다.
cin.clear(); // clear an eventual "bad read" flag
cin.ignore(BIG\_NUMBER,’\n’); // ignore all remaining pending input
cin.get(); //just read one more!
BIG\_NUMBER는… 입력 할 수있는 문자보다 큽니다. Enter 키를 누르기 전에 콘솔을 엽니 다.
이 번호를 얻는 표준 방법은
numeric\_limits
(don 잊지 마세요 #include
)
그래서 결국…
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
cin.get();
}
적절한 일시 중지 기능이어야합니다.
하지만 이제 알려주세요.
누군가가 입력하면
12abcd\n
??
첫 번째 읽기에는”12 “가 표시되고 두 번째 읽기에는”a… “가 표시되며 실패합니다 (숫자가 아닙니다!). B는 전혀 읽히지 않습니다.
pause()
보다 “불량 비트”를 지우고 abcd\n
를 삭제 한 다음 “1”을 읽고 행복하게 종료합니다.
도덕적 : 숫자를 읽을 때 항상 읽기가 실패하지 않았는지 확인하고 결국 잘못된 입력을 버립니다.
while(!(cin >> b))
{ cin.clear(); cin.ignore(numeric\_limits
하지만 관리도 필요합니다. 프롬프트 등 … 실제 목적에서 너무 멀리 떨어져 있습니다.
답변
깨끗한 해결책이 아닙니다. 어떤 사람들은 이것을 “해킹”이라고 부르고 어떤 사람들은 “해결책”이라고 부르기도합니다.
C 언어의 좋은 속성 중 하나는 입니다. 휴대 성 . 그리고 system (“PAUSE”) 구문을 사용하면 프로그램을 실행하는 데 사용하는 콘솔에 따라 다르기 때문에이 이식성을 잃게됩니다.
자, 대안은 무엇입니까? 슬프게도 완벽하게 깨끗한 해결책은 없습니다. 이 구문을 사용하는 사람들을 본 적이 있습니다.
std::cout << “Press any key to continue…”;
std::cin >> Some\_variable\_you\_declared\_in\_advance;
기본적으로 이것은 스트림을 사용하여 프로그램을 일시 중지하는 또 다른 해킹입니다. 그러나 이런 식으로 휴대 성을 잃지 않습니다.
내가 아는 가장 깨끗한 솔루션 중 하나는 다음과 같습니다 (하지만 맛에 따라 매우 다릅니다).
void pause () {
std::cin.ignore();
}
이렇게하면 고유 한 일시 중지 기능을 사용할 수 있습니다. . 그것은 기본적으로 한 문자를 읽고 무시합니다. 그러나 제가 말했듯이, 그것은 확실히 최선의 해결책은 아니며 제가 개인적으로 좋아하는 것입니다.