2016-09-08 8 views
1

사용자가 "입력"을 누르고 루핑을 계속 할 때 내 프로그램이 인식하도록합니다. 그러나 프로그램에서 "입력"을 식별하는 방법을 파악할 수 없습니다."확인"

string enter; 
string ent = "\n"; 
dice d1; 

cout << "To start - Press enter" << endl; 
getline (cin, enter); 

while (enter == ent) 
{ 
    d1.throw_dice(); 
    d1.draw_dice(); 
    cout << "Try again, press enter" << endl; 
    getline (cin, enter); 
} 

cout << "Thank you for playing"<< endl; 

그리고이 하나 : 두 가지 방법을 시도

string enter; 
dice d1; 

cout << "To start - Press any key and enter" << endl; 
getline (cin, enter); 

while (enter == "\n") 
{ 
    d1.throw_dice(); 
    d1.draw_dice(); 
    cout << "Try again, press enter" << endl; 
    getline (cin, enter); 
} 

cout << "Thank you for playing"<< endl; 

내가 그 문자열이 떨어져 "N \"을 던져 알고 있지만, 캔트 정말 해결하는 방법을 찾을 수 있습니다.

PS는 :

나는 해결책을 발견 하였다. 그러나 나는 여전히 더 나은 선택이 있어야한다고 생각합니다.

 while (cin.get() == '\n') 
    { 
     d1.throw_dice(); 
     d1.draw_dice(); 
     cout << "Try again, press enter! Or press any other key and enter" << endl; 
     if (cin.get() != '\n') 
      break; 
    } 

    cout << "Thank you for playing"<< endl; 

    return 0; 
} 
+0

질문을 C++로 태그 지정하여 올바른 사람을 볼 수 있습니다. –

답변

0

표준 :의 getline

처음 두 경우에, 당신은 당신이 정말로 감지하는지 있지만 (AN이 눌러 입력 감지하려는 경우 입력 getline를 사용하여 두 가지 문제가있다 줄 바꿈이고 Enter 키를 누르는 것이 생성 될 수있는 유일한 방법은 아니지만 일반적으로 가장 간단합니다. 먼저, 여러분이 말했듯이, getline이 구분 기호로 사용하는 것은 읽는 입력을 빠져 나올 것이므로, 좀더 복잡한 것들을 사용하지 않고 실제로 사용하는 개행을 포함시킬 수는 없습니다. 두 번째로, 개행 전에 입력 한 문자도 모두 getline 행에 포함되므로 단순히 문자열 "\n"과 비교해도 개행 문자가 읽혔는지 여부는 알 수 없습니다. 단락 문자를 유지하는 데는 getline 인 경우도 있습니다. '티.

또 다른 문제는 입력 스트림 cin이 읽을 때 오류 상태가 아닌지 확인하는 것이 좋습니다. 그렇지 않은 경우 getline은 입력 된 줄 바꿈을받은 후에 만 ​​진행해야합니다.

원칙적으로 이는 올바른 오류 검사를 수행 할 때 입력 자체가 줄 입력을 입력으로 사용하는 비 - 입력 키 방식에 신경 쓰지 않으면 문자열 자체를 검사하지 않아도됩니다 전혀 입력 키가 눌 렸음을 알기 위해 - getline이 입력 차단을 멈췄을 때 스트림 상태 플래그에있는 것처럼 "오류"의 끝 파일을 포함합니다.) 오류가 발생하지 않은 경우 구분 기호는 줄 바꿈 문자입니다. 따라서 getline(cin, enter)의 차단 동작을 사용하여 제어 흐름을 지시 할 수 있지만 루프를 종료하려면 줄 바꿈 이외의 것이 입력되었는지 (또는 파일 끝이 입력되었거나 오류가 발생했는지 확인해야 할 필요가 있음) , 상태 플래그를 확인하여 cin).

표준 : istream로는 :: getline와는 달리, 당신은 세 번째 경우에 사용하고있는 cin.get() 방법으로

, 실제로 개행 문자를 검색 할 수 있습니다) (얻을 - 당신이 제공하는 코드는 두 개의 입력이 필요하지만, 첫 번째 이후 루프 반복마다 프레스 (하나는 의심 스럽습니다). 별도의 조건부 break 케이스가 필요하지 않아야하며 루프 조건이 충분해야합니다. 실패 케이스에서는 no-args std::istream::get()이 값을 반환합니다.이 값은 \n과 같지 않으므로 루프가 종료됩니다.즉,

두 번 누를 필요없이 다음 루프로 이어지는 한 루프 반복 이후에 Enter 키를 누르는 동작을 제공해야합니다.

"다른 문자 입력 후 끝내려면 입력하십시오."라는 다소 어색한 구문이 남아 있지만 부분적으로는 일반 명령 줄 터미널과 같은 줄 바꿈 입력의 제한으로 인한 결과입니다. . 위 루프를 사용하면 파일 끝 (UNIX 계열 시스템에 따라 다르지만 일반적으로 CTRL+D)에 플랫폼의 키 조합을 입력하여 즉시 Enter 키를 누르지 않고 종료 할 수 있습니다. 이것은 일반적인 대화 형 키보드 입력 (명령 행 환경에서 라인별로 입력하는 것과는 반대로 키를 눌러 직접 일어남)이 프로그램의 범위보다 훨씬 복잡 할 수 있습니다. 일반적으로 외부 라이브러리 및/또는 플랫폼 별 지원이 필요합니다. C++에 대해 자세히 알고 싶다면 this question에 대한 답을 살펴보십시오.

즉, 대화 형 명령 줄 프로그램의 키 누르기를 감지하는 데는 일반적으로 cin.get()보다 더 나은 옵션이 있지만 입력 이외의 키를 누르는 것을 감지하고 즉각적인 응답 (다른 입력을 기다리는 대신). cin.get()getline() 이외의 다른 입력 처리 옵션은 기본 플랫폼 독립적 인 C++에서 사용할 수 있지만 이러한 유형의 문제에 대해서는 모두 알고 있습니다. cin에 대한 입력이되지 않는다는 사실 행의 끝까지 입력 스트림에서 사용할 수 있습니다. 플랫폼 특정 코드 (또는 플랫폼 특정 코드가 들어있는 외부 라이브러리)로 이동하지 않고도 해당 사실을 변경하거나 해결할 수 있습니다.