2015-01-13 59 views
-2

我有一個菜單,用戶必須在1-5之間輸入一個數字,任何時候用戶輸入一個完美的數值,它將會轉到指定的情況或者無效數字,它會進入默認狀態,並出現一條錯誤消息。Switch/Case不間斷循環

現在我的問題是,當用戶輸入一個字母表字母,程序保持循環和循環,它不會停止,每次通過默認。

我試了很多東西!使用if語句檢查數字是否爲1 < =值< = 5不起作用。如果輸入不在這些值之間,我嘗試在數字中進行硬編碼,但它仍會永遠循環。我試着做cim.good(),不知道我是否做得對,但我做到這一點的方式不起作用。我也嘗試使用isdigit()函數,但同樣的問題,它不起作用...我真的不知道我該做什麼。這是我的(簡化)。

int menu() 
{ 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    cin >> key; 

    return(key); 
}` 

void main() 
{ 
    Menu: 
      key = menu(); 

      switch(key) 
      { 
      case 1: 
       goto Menu; 
      case 2: 
       goto Menu; 
      case 3: 
       goto Menu; 
      case 4: 
       goto Menu; 
      case 5: 
       break; 
      default: 
       cout << endl << "Invalid entry, please try again" << endl; 
       goto Menu; 
      } 
} 

我刪除了箱子裏面的東西,使其看起來更好。當我輸入密鑰時,我不斷收到「無效輸入,請再試一次」的消息,這就是它所經歷的地方。

編輯:好吧,我爲'goto'道歉,不知道它皺眉,還在學習!謝謝大家所有的幫助。我會開始刪除它們。

+4

'goto'?在C++中?奧利? http://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto – Jack

+4

避免'goto',除非它使事情更容易理解。提示:這意味着專家可能會在十年內使用它一次,或者...... – Deduplicator

+0

「我試着做cim.good(),不知道我是否做得對,但我做的方式不起作用。」請儘量給出更多細節,下次你做了什麼,所以我們可以嘗試給你一些關於你的錯誤的具體提示。 – LiKao

回答

1

而是然後用goto,我建議你使用一個簡單的循環do {} while

#include <iostream> 

using namespace std; 

int menu() { 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    cin >> key; 

    return(key); 
} 

int main(int argc, char *argv[]) { 
     int key; 
     do { 
       key = menu(); 
     } while (key < 1 || key > 5); 
     cout << key << endl; 
} 

哪些循環key < 1key > 5

+0

我從來沒有見過在main()中使用的參數,argc和argv是做什麼的?我不知道goto皺眉,但對我來說,這些簡單的goto看起來更整潔,也更容易遵循(可能是因爲我沒有得到它)​​。但是這個代碼是如何工作的? – Maty

+0

@Maty他們與你的案件無關,無論如何都是可選的。許多程序員只是在模板代碼片段中使用它,而不管這些參數是否被使用。 –

+0

啊,好的。我會對do {}函數進行研究,看看它是如何工作的。但是這裏最後一個問題,沒有案例,所以它怎麼知道去哪裏?還是Elliott剛剛把那部分拿出來了,還有什麼東西在裏面? – Maty

1

看看來自C++ FAQ lite和this postingthis posting

使用cin.good()進行檢查是解決方案的第一部分。如果輸入非整數cin.good()將返回false。但是,不正確的輸入將保留在緩衝區中。因此,如果您再次遇到cin >> key,它將再次無法讀取任何內容。

你必須使用cin.clear()清除狀態,然後忽略緩衝區的其餘部分(直到行尾)使用cin.ignore(INT_MAX, '\n')

所以你的方法將成爲:

int menu() { 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    while(cin >> key) { // same as querying cin.good() 
     cout << "Not a number" << endl; 
     cin.clear(); 
     cin.ignore(INT_MAX, '\n'); 
    } 

    return(key); 
} 
+0

我做了一個測試,我有一個if語句來測試cin.good()是否無效。當我插入一個字符時,我認爲它不是(就像你提到的那樣),所以我硬編碼了那裏的關鍵值(在if語句中),key = 6,應該清除它?或沒有? – Maty

+1

@Maty:不確定你的評論是什麼意思。請張貼您嘗試編輯您的問題的代碼。真實的代碼給你更好的印象。 – LiKao