2017-04-04 104 views
0

嘿這一切是我的代碼嘗試捕捉重複循環

void Student::studentMenu() { 
    int choiceInput; 
    const string ErrorMsg; 
    cout << "-------------Student Menu--------------" << endl; 
    cout << "(1)Start Quiz" << endl; 
    cout << "(2)View History Score Table" << endl; 
    cout << "(0)Exit" << endl; 
    cout << "Option: " << endl; 
    try { 
     cin >> choiceInput; 

     if (choiceInput < 0 || choiceInput>2 || !cin) 
     { 
      throw (ErrorMsg); 
     } 

     while (choiceInput != 0) { 
      switch (choiceInput) { 
      case 1: 
       generateQuiz(); 
       break; 
      case 2: 
       break; 
      case 0: 
       break; 
      } 
      break; 
     } 
    } 
    catch (string msg) 
    { 
     cout << "Please only enter valid integer from 0-3" << endl; 
     Student::studentMenu(); 
    } 
} 

基本上它檢查用戶輸入和引發異常,如果它的一個非整數大於3顯示錯誤信息後,它應重定向回學生菜單()頁面。輸出的目的是當我輸入一個像5這樣的整數,但是當我輸入一個字符'f'時,它會一直循環顯示錯誤信息

請幫助我謝謝!

回答

3
cin >> choiceInput; 

當輸入不是分析的整數會發生什麼,CIN不會自動跳過它。這意味着你被困在這個值上:你嘗試閱讀它,它失敗了,你進行了一次迭代,你嘗試閱讀它,失敗等等。爲了解決這個問題,你應該在錯誤的字符中讀取錯誤的字符(例如!cin返回true)。通常情況下,這將是這個樣子:

if (!cin) { 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} //proceed 

cin.clear()需要清除failbit,使!cin再次變成假)

+0

你是一個天才!感謝它現在的工作 –

+0

@NewbieICTIS不客氣。 –

0

你需要用來初始化用無效值choiceInput變量:

int choiceInput = -1; 

而且在你發現使用cout.flush()打電話來studentMenu()之前,以確保您清除緩衝區:

catch (string msg) 
    { 
    cout << "Please only enter valid integer from 0-3: " << choiceInput << endl; 
    cout.flush(); 
    } 
+0

不work..still循環 –

+0

@NewbieICTIS編輯! – Rama

0

choiceInput是一個整數,'f'的ascii值是102,它是> 2.我建議你應該在choiceInput上添加一些檢查,以確保它是一個整數而不是一個字符。

How to check if input is numeric in C++

+0

由於值爲102,它仍然落在無效輸入之外,但是爲什麼它是循環的?它不會發生到10雖然.. 是的,我是不得不使用嘗試和例外這 –