2012-11-20 106 views
0

因此,我正在處理的這個程序沒有按照我想要的方式處理不正確的用戶輸入。用戶應該只能輸入一個3位數字,以便稍後在HotelRoom對象構造函數中使用。不幸的是,我的教師不允許在他的班級中使用字符串對象(否則,我認爲我不會有任何問題)。另外,我將roomNumBuffer傳遞給構造函數來創建一個const char指針。我目前正在使用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

讀取一個整數,並測試它是否在所需範圍:

int n; 

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

這會工作,但我需要有一個char數組傳遞給構造函數(接受char數組並創建一個const char指針)。 – Nyxm

0

雖然Kerrek SB提供的方法如何解決這個問題,只是爲了解釋什麼時候錯了你的做法:整數數組就能成功被閱讀。溪流狀態良好,但你沒有到達一個空間。也就是說,用你的方法,你還需要測試的最後一個數,即後面的字符,該流中的下一個字符,是某種形式的空白:

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

似乎錯誤儘管如此,第一個值的恢復並不完全正確。您可能還想要ignore()所有字符,直到行尾。