2015-08-28 39 views
0

這裏是代碼爲默認情況下的int參數創建了一個switch case。但默認情況下是無法妥善處理的字符

int miscellaneous::printWelcomeScreen(){ 
    int ch; 
    cout<<"Tic Tac Toe"<<endl<<endl; 
    cout<<"1. Play Game "<<"2. How to Play "<<"3. Credits "<<endl; 
    cout<<endl<<"Enter Your Choice"<<endl; 
    cin>>ch; 
    choiceSelection(ch); 
    return 0; 
} 

int miscellaneous::choiceSelection(int ch){ 
    switch(ch){ 
    case 1: break; 
    case 2: showHelp();break; 
    case 3: showCredits();break; 
    default: { 
      cout<<"Wrong Choice dude!! Use your keyboard Properly next time"; 
      printWelcomeScreen(); 
      break; 
      } 
    } 
    return 0; 
} 

當我給一個INT輸入,默認情況下完美的作品, 但是當我給一個字符輸入,默認情況下,開始在無限運行循環。

爲什麼會發生這種情況? 我甚至在傳遞切換之前嘗試解析ch。

+0

你可能最好使用'char ch'而不是'int ch'並更新'switch'來檢查字符'1','2'和'3'。 –

回答

2

當你輸入一個char值時,cin(輸入)操作失敗,輸入ch以外的其他值。 因此,他們需要檢查天氣輸入操作是否失敗。爲此使用cin.fail()將在cin上設置失敗。

int miscellaneous::printWelcomeScreen() 
{ 
    int ch = 0; 
    cout<<"Tic Tac Toe"<<endl<<endl; 
    cout<<"1. Play Game "<<"2. How to Play "<<"3. Credits "<<endl; 
    cout<<endl<<"Enter Your Choice"<<endl; 
    cin >> ch; 
    if(cin.fail() != 0) 
    { 
     std::cout << "Hey! That's not valid input! Try again.\n\n" 
     cin.clear(); 
     cin.ignore(10000,'\n'); 
    } 
    cout << " ch = " << ch << endl; 
    choiceSelection(ch); 
    return 0; 
} 

當cin被檢查並發現失敗,則需要清除cin上的錯誤標誌。詳情在此鏈接解釋: Why would we call cin.clear() and cin.ignore() after reading input?

+0

謝謝,它工作。我應該在每次輸入後調用cin.clear()嗎? –

+1

@VikasKumar是的,它的一個很好的做法來檢查讀取操作是否成功。如果失敗了,那麼你需要調用cin.clear()。 –

1

您不檢查讀取是否失敗。因此,如果std::cin一次失敗,它將隱含地失敗,直到處理這種情況,導致無限遞歸和最終的堆棧溢出。改用這樣的東西。

int miscellaneous::printWelcomeScreen() { 
    int n; 
    bool again; 

    do { 
     again = false; 

     std::cout << "Tic Tac Toe\n\n1. Play Game\n2. How to Play\n3. Credits\n\nEnter your choice: "; 
     std::cin >> n; 
     if(std::cin.fail() || !choiceSelection(n)) { 
      again = true; 
      std::cout << "Hey! That's not valid input! Try again.\n\n" 

      continue; 
     } 
    } while(again); 

    return 0; 
} 

bool miscellaneous::choiceSelection(int n) { 
    switch(n) { 
     case 1: 
      // ... 
      break; 

     case... 

     default: 
      return false; 
    } 

    return true; 
}