시스템 일시 중지를 사용할 때의 단점은 무엇입니까?


최상의 답변

C ++ 실격에 대한 제가 가장 좋아하는 질문 중 하나입니다. 전문가 .

물론 시스템 ( “PAUSE”)은 OS 셸을 만들고 “PAUSE”명령을 실행하도록하는 것을 의미합니다.

사실 보안 문제가 아닌 Windows에서만 작동합니다. “PAUSE “는 외부 프로그램을 호출하지 않는 쉘 내부 명령이기 때문입니다 (시스템 쉘 자체가 해킹되지 않는 한… 그러나 다른 문제가 있습니다.)

윈도우에서는 큰 “성능 문제”도 아닙니다. CMD.EXE의 이미지는 이미 RAM에 있고 CMD 데이터 세그먼트는 매우 작으며… … 일시 중지를 요청합니다 (가능한 빨리 실행하지 마십시오!)

다른 창 에서 작동하지 않음 (PAUSE 명령이 없을 수 있음) 보안 유출 (누군가 n 자신의 작업 대신 자신의 작업을 수행 할 PAUSE 프로그램을 만듭니다.

따라서 자신 만의 컴퓨터와 자신의 OS를 대상으로하지 않는 한 이식성이없고 위험 할 수도 있습니다.

p>

하지만 이제 문제는 “ 무엇을해야합니까 ?”가됩니다.

대답은… 잘못 입니다.… 작동 할 수 없기 때문입니다!

이유를 살펴 보겠습니다.

당신의 프로그램 cin-두 개의 정수, 몇 가지 결과를 보여주고… 기다려야하나요 아니면 종료해야하나요?

가정하자 기다리시겠습니까? cin >> acin >> b에 어떻게 대답합니까?

입력 내용은 다음과 같습니다.

12\n

34\n

이러한 f를 입력해야합니다. 콘솔 입력 모드를 종료해야하므로 .ing이 반환됩니다.

이제 cin >> a 는 “12”를 사용합니다. 반환 값은 버퍼에 남아 있습니다.

cin >> b는 모든 숫자보다 첫 번째 공백이 아닌 공백까지 모든 공백 (반환 포함)을 사용합니다. “\ n34″를 소비합니다 (그리고 b = 34로 설정).

입력 버퍼에 f… ing이 돌아올 때까지 있습니다. 이제 모든 전문가가 실패!

  1. cin.get()를 사용하는 방법을 살펴 보겠습니다. 잘못된 : 한 문자를 읽고 계속합니다. 그리고 입력 버퍼에 문자가 하나 있으므로 일시 중지되지 않습니다 !
  2. 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::max()

(don 잊지 마세요 #include )

그래서 결국…

void pause()

{

cin.clear();

cin.ignore(numeric\_limits::max(),’\n’);

cin.get();

}

적절한 일시 중지 기능이어야합니다.

하지만 이제 알려주세요.

누군가가 입력하면

12abcd\n

??

첫 번째 읽기에는”12 “가 표시되고 두 번째 읽기에는”a… “가 표시되며 실패합니다 (숫자가 아닙니다!). B는 전혀 읽히지 않습니다.

pause()보다 “불량 비트”를 지우고 abcd\n를 삭제 한 다음 “1”을 읽고 행복하게 종료합니다.

도덕적 : 숫자를 읽을 때 항상 읽기가 실패하지 않았는지 확인하고 결국 잘못된 입력을 버립니다.

while(!(cin >> b))

{ cin.clear(); cin.ignore(numeric\_limits::max(),’\n’); }

하지만 관리도 필요합니다. 프롬프트 등 … 실제 목적에서 너무 멀리 떨어져 있습니다.

답변

깨끗한 해결책이 아닙니다. 어떤 사람들은 이것을 “해킹”이라고 부르고 어떤 사람들은 “해결책”이라고 부르기도합니다.

C 언어의 좋은 속성 중 하나는 입니다. 휴대 성 . 그리고 system (“PAUSE”) 구문을 사용하면 프로그램을 실행하는 데 사용하는 콘솔에 따라 다르기 때문에이 이식성을 잃게됩니다.

자, 대안은 무엇입니까? 슬프게도 완벽하게 깨끗한 해결책은 없습니다. 이 구문을 사용하는 사람들을 본 적이 있습니다.

std::cout << “Press any key to continue…”;

std::cin >> Some\_variable\_you\_declared\_in\_advance;

기본적으로 이것은 스트림을 사용하여 프로그램을 일시 중지하는 또 다른 해킹입니다. 그러나 이런 식으로 휴대 성을 잃지 않습니다.

내가 아는 가장 깨끗한 솔루션 중 하나는 다음과 같습니다 (하지만 맛에 따라 매우 다릅니다).

void pause () {

std::cin.ignore();

}

이렇게하면 고유 한 일시 중지 기능을 사용할 수 있습니다. . 그것은 기본적으로 한 문자를 읽고 무시합니다. 그러나 제가 말했듯이, 그것은 확실히 최선의 해결책은 아니며 제가 개인적으로 좋아하는 것입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다