2012-12-05 32 views
1

我寫了一個switch語句,並創建了一個默認值,它會簡單地說用戶選擇了一個錯誤的選項並重復輸入。我想確保如果出現問題,它將首先清除緩衝區,因此我使用了cin.sync(),但爲輸入輸入'a'仍導致無限循環。我添加了cin.clear()來清除給我工作代碼的標誌......但是我的困惑是爲什麼它能夠工作。如果出現故障標誌,cin.sync()是否不起作用?爲什麼cin.clear()修復由於輸入到cin的錯誤而導致的無限循環?

聲明如下,截斷爲簡潔:

while(exitAllow == false) 
{ 
    cout<<"Your options are:\n"; 
    cout<<"1: Display Inventory\n"; 
    /*truncated*/ 
    cout<<"5: Exit\n"; 
    cout<<"What would you like to do? "; 

    cin.clear(); //HERE IS MY CONFUSION// 
    cin.sync(); 
    cin>>action; 
    switch(action) 
    { 
     case 1: 
        /*truncated*/ 
     case 5: 
      exitAllow = true; 
      break; 
     default: 
      cout<<"\ninvalid entry!\n"; 
      break; 
    } 
} 

回答

3

一旦你嘗試閱讀和失敗,流標是在一個失敗狀態,以及所有後續嘗試讀取會自動失效直到您清除失敗標誌,這是通過clear()函數完成的。

你應該後檢查流的狀態,爲每個閱讀:

if (cin >> var) { 
    // do something sensible 
} else { 
    cin.clear(); 
} 

否則存儲在var最後的成功讀取後的值將被認爲是你的算法的電流輸入。

+0

謝謝先生。另外,「做一些明智的事情」讓我發笑。 –

相關問題