2010-02-13 54 views
4

我想讓用戶輸入一箇中心數字的字符,例如: 10,但是,用戶可能輸入超過10個。如何在C++中清除不必要的輸入流

for(int i = 0 ; i< 10 ; i++) 
cin>>x; 

額外的字符可能會讓我的代碼崩潰,因爲我稍後會要求輸入。

如何在用戶輸入超過10時清除輸入?

非常感謝!

回答

0

順便說一句,爲了避免每次都重複所有的代碼,我曾經寫了一個小模板函數來完成這項工作:

template<typename InType> void AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString, InType & Result) 
{ 
    do 
    { 
     Os<<Prompt.c_str(); 
     if(Is.fail()) 
     { 
      Is.clear(); 
      Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } 
     Is>>Result; 
     if(Is.fail()) 
      Os<<FailString.c_str(); 
    } while(Is.fail()); 
} 

template<typename InType> InType AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString) 
{ 
    InType temp; 
    AcquireInput(Os,Is,Prompt,FailString,temp); 
    return temp; 
} 

,如果你想避免複製第一個重載可優選,該其次可能更適合內建類型。 使用示例:

//1st overload 
int AnInteger; 
AcquireInput(cout,cin,"Please insert an integer: ","Invalid value.\n",AnInteger); 

//2nd overload (more convenient, in this case) 
int AnInteger=AcquireInput(cout,cin, "Please insert an integer: ","Invalid value.\n"); 
5
std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n'); 

這應該重置失敗位並忽略錯誤的輸入。

+0

streamsize可爲輸入?大小如何取決於其他變量是動態的? – skydoor 2010-02-13 05:04:47

+0

'streamsize'是一種類型。 'cin.ignore()'有兩個參數:要忽略的最大字符數(類型是'streamsize'),以及停止忽略的分隔符(類型是'char')。 'std :: numeric_limits :: max()'意味着「可以放入'streamsize'類型的變量中的最大數字,所以整行意味着」直到忽略換行符纔會忽略儘可能多的字符,然後停止。 – 2010-02-13 05:15:19

+0

...假設輸入錯誤是罪魁禍首...... – Potatoswatter 2010-02-13 08:30:19

0

cin進入錯誤模式並在用戶輸入無效時停止執行任何操作。您需要添加一個檢查無效輸入和循環以重試。

for(int i = 0 ; i< 10 ; i++) 
    while ((cin >> x).rdstate() == ios::failbit) { 
     cin.clear(); 
     cin.ignore(numeric_traits<streamsize>::max(), '\n'); 
    } 

這是很多工作,但您需要定義某種策略來忽略無效輸入。還有其他選擇;這只是忽略了該行的其餘部分。

0

這顯示瞭如何清除整個緩衝區上的錯誤。

http://support.microsoft.com/kb/132422

/* No special compile options needed. */ 

#include <iostream.h> 

int ClearError(istream& isIn)  // Clears istream object 
{ 
    streambuf* sbpThis; 
    char  szTempBuf[20]; 
    int   nCount, nRet = isIn.rdstate(); 

    if (nRet)      // Any errors? 
    { 
     isIn.clear();     // Clear error flags 
     sbpThis = isIn.rdbuf();  // Get streambuf pointer 
     nCount = sbpThis->in_avail(); // Number of characters in buffer 

     while (nCount)    // Extract them to szTempBuf 
     { 
      if (nCount > 20) 
      { 
       sbpThis->sgetn(szTempBuf, 20); 
       nCount -= 20; 
      } 
      else 
      { 
       sbpThis->sgetn(szTempBuf, nCount); 
       nCount = 0; 
      } 
     } 
    } 

    return nRet; 
} 

void main() 
{ 
    int n = 0, nState; 
    while (n <= 100) 
    { 
     cout << "Please enter an integer greater than 100.\n"; 
     cin >> n; 
     nState = ClearError(cin); // Clears any errors in cin 
    } 
}