2012-11-20 4 views
0

그래서이 프로그램은 잘못된 사용자 입력을 원하는 방식으로 처리하지 않습니다. 사용자는 나중에 HotelRoom 개체 생성자에서 사용할 수 있도록 3 자리 숫자 만 입력 할 수 있습니다. 불행히도, 강사는 수업 시간에 문자열 개체를 사용할 수 없습니다 (그렇지 않으면 아무런 문제가 없을 것입니다). 또한 const char 포인터를 생성하기 위해 roomNumBuffer를 생성자에 전달합니다. 현재 iostream, iomanip, string.h를 사용하고 있으며 전 처리기 지시문을 제한합니다. 이 문제는 roomNumBuffer에 너무 많은 문자를 입력하려고 시도한 후에 발생합니다. 다음 스크린 샷은 어떻게되는지 보여줍니다 는 enter image description here사용자 입력을 올바르게 처리하지 않음

이 문제에 대한 관련 코드는 다음과 같습니다

cout << endl << "Please enter the 3-digit room number: "; 
do {  //loop to check user input 
    badInput = false; 
    cin.width(4); 
    cin >> roomNumBuffer; 
    for(int x = 0; x < 3; x++) { 
     if(!isdigit(roomNumBuffer[x])) {  //check all chars entered are digits 
      badInput = true; 
     } 
    } 
    if(badInput) { 
     cout << endl << "You did not enter a valid room number. Please try again: "; 
    } 
    cin.get();  //Trying to dum- any extra chars the user might enter 
} while(badInput); 

for(;;) { //Infinite loop broken when correct input obtained 
    cin.get();  //Same as above 
    cout << "Please enter the room capacity: "; 
    if(cin >> roomCap) { 
     break; 
    } else { 
     cout << "Please enter a valid integer" << endl; 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 
} 
for(;;) { //Infinite loop broken when correct input obtained 
    cout << "Please enter the nightly room rate: "; 
    if(cin >> roomRt) { 
     break; 
    } else { 
     cout << "Please enter a valid rate" << endl; 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 
} 

모든 아이디어를 주시면 감사하겠습니다. 미리 감사드립니다.

+0

첫 번째 구문 분석 단계로'getline'을 사용하지 않는 것은 제멋대로입니다. [이걸 좋아해.] (http://stackoverflow.com/a/13445220/596781). –

+0

@KerrekSB 동의합니다. 그러나 cin.width()를 사용하면 달성하려는 작업에 도움이 될 것이라고 생각했습니다. 나는 ** getline **을 시도 할 때 같은 문제가 발생했다. 대신이 문제를 해결할 때 어떻게 대처할 수 있습니까? – Nyxm

답변

2

정수를 읽고이 원하는 범위에 있는지 여부를 테스트 : Kerrek SB 방법 만 설명하는 문제를 해결하는 접근 방식을 제공하지만

int n; 

if (!(std::cin >> n && n >= 100 && n < 1000)) 
{ 
    /* input error! */ 
} 
+0

이것은 작동하지만 char 배열을 가져 와서 생성자에 전달해야합니다 (char 배열을 가져 와서 const char 포인터를 만듭니다). – Nyxm

0

무엇을 할 때 잘못된 당신의 접근 방식 : 정수 배열이 성공적으로 수 읽을 수 있습니다. 스트림 상태가 좋았지 만 공간에 도달하지 못했습니다.

if (std::isspace(std::cin.peek())) { 
    // deal with funny input 
} 

그것은 오류를 보인다 즉, 당신의 접근 방식을 사용하여, 당신은 또한, 즉 마지막 숫자, 다음과 같은 문자가, 스트림 내의 다음의 문자가, 어떤 종류의 공백인지 테스트해야합니다 것 첫 번째 가치에 대한 회복은 옳지 않습니다. 줄의 끝까지 ignore() 모든 문자가 필요할 수도 있습니다.

관련 문제