我想讓用戶輸入一箇中心數字的字符,例如: 10,但是,用戶可能輸入超過10個。如何在C++中清除不必要的輸入流
for(int i = 0 ; i< 10 ; i++)
cin>>x;
額外的字符可能會讓我的代碼崩潰,因爲我稍後會要求輸入。
如何在用戶輸入超過10時清除輸入?
非常感謝!
我想讓用戶輸入一箇中心數字的字符,例如: 10,但是,用戶可能輸入超過10個。如何在C++中清除不必要的輸入流
for(int i = 0 ; i< 10 ; i++)
cin>>x;
額外的字符可能會讓我的代碼崩潰,因爲我稍後會要求輸入。
如何在用戶輸入超過10時清除輸入?
非常感謝!
順便說一句,爲了避免每次都重複所有的代碼,我曾經寫了一個小模板函數來完成這項工作:
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");
std::cin.clear();
std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
這應該重置失敗位並忽略錯誤的輸入。
cin
進入錯誤模式並在用戶輸入無效時停止執行任何操作。您需要添加一個檢查無效輸入和循環以重試。
for(int i = 0 ; i< 10 ; i++)
while ((cin >> x).rdstate() == ios::failbit) {
cin.clear();
cin.ignore(numeric_traits<streamsize>::max(), '\n');
}
這是很多工作,但您需要定義某種策略來忽略無效輸入。還有其他選擇;這只是忽略了該行的其餘部分。
這顯示瞭如何清除整個緩衝區上的錯誤。
從: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
}
}
streamsize可爲輸入?大小如何取決於其他變量是動態的? – skydoor 2010-02-13 05:04:47
'streamsize'是一種類型。 'cin.ignore()'有兩個參數:要忽略的最大字符數(類型是'streamsize'),以及停止忽略的分隔符(類型是'char')。 'std :: numeric_limits :: max()'意味着「可以放入'streamsize'類型的變量中的最大數字,所以整行意味着」直到忽略換行符纔會忽略儘可能多的字符,然後停止。 –
2010-02-13 05:15:19
...假設輸入錯誤是罪魁禍首...... – Potatoswatter 2010-02-13 08:30:19