我正在尝试确定用户是否输入了字符以外的内容,具体而言,他们只输入m或s。见下面的代码。
注意:
filingStatus
是char
do
{
cout << "Please enter your filing status (s for single, m for married)" << '\n';
cin >> filingStatus;
if (cin.fail())
{
cin.clear();
dataTest = 1;
cout << "Error, please enter a valid input!" << '\n';
double dummyDouble;
cin >> dummyDouble;
if (cin.fail())
{
cin.clear();
cin >> dummyString;
}
}
else
{
if (filingStatus == 'm' || filingStatus == 's')
{
dataTest = 0;
}
else
{
cout << "Error, please enter either m or s!" << '\n';
dataTest = 1;
}
}
} while (dataTest == 1);
这是问题所在,例如,如果输入1000,则输入不会失败。它将1存储在char中,并且因为1既不是m也不是S,它再次循环,然后它将0,循环再次置为0,等等。
我的理解是当它看到一个整数存储在char中时会失败,但显然它没有失败。
我的问题是:
答案 0 :(得分:2)
输入没有失败,因为'1'
是一个字符。数字是字符的子集。
阅读std::string
。然后测试该字符串是否包含所需范围内的单个字符。
但请注意,使用>>
读取字符串会在第一个空格处停止。要防止这种情况并改为读取整行,请使用std::getline()
。
答案 1 :(得分:0)
我假设fillingStatus
属于char
类型。
现在,即使您输入数字说“1”或“0”,它也会被读作字符。因此,cin不会失败。它只是按照你的代码继续循环。
此外,在读取无效字符时,应注意清除输入缓冲区,因为返回字符'\ n'与输入缓冲区中的其他字符一起保留。
我会这样做:
while ( !(cin >> fillingStatus) || (filingStatus != 'm' && filingStatus != 's') ) {
cout << "Error, please enter either m or s!" << '\n'; // error message
cin.clear(); // clear the error flag
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // ignore all invalid previous input
}
答案 2 :(得分:0)
一种方法是将fillingStatus
更改为string
并仅获取该字符串的第一个字符,看它是否失败。
或者,曾经有一种获取字符输入的方法,getche()
我认为(自从我使用C ++已经很多年了,所以不要完全回忆起来)...你也许可以使用那也是。
由于
答案 3 :(得分:0)
由于您一次只读取输入的一个字符,因此您基本上无法判断用户输入的内容是多少,并且在您从输入流中读取更多内容之前它一直处于保持状态。
使用string
一次读取一行数据并让程序对整个字符串作出反应将解决您的问题。
答案 4 :(得分:0)
std::string filingStatus ;
while(!(cin >> filingStatus ) || ( filingStatus != "m" && filingStatus != "f") )
{
cin.clear();
std::cout << "Error, please enter either m or s!" << '\n';
};