过滤出无效的用户输入 我试图用下面的代码块过滤一个小C++程序中的无效用户输入: int selection = -1; while (!(selection >= 1 && selection <=4)) { cin >> selection; if (!(selection >= 1 && selection <=4)) { cout << "invalid selection!" << endl; cout << "selection: "; } } int-selection=-1; 而(!(选择>=1&&selection>selection; 例如,当您输入字母时,如果(!(选择>=1&&selection
,它会将过滤出无效的用户输入 我试图用下面的代码块过滤一个小C++程序中的无效用户输入: int selection = -1; while (!(selection >= 1 && selection <=4)) { cin >> selection; if (!(selection >= 1 && selection <=4)) { cout << "invalid selection!" << endl; cout << "selection: "; } } int-selection=-1; 而(!(选择>=1&&selection>selection; 例如,当您输入字母时,如果(!(选择>=1&&selection,c++,stl,validation,C++,Stl,Validation,,它会将cin置于错误状态并保留这些字符。您需要忽略它们(cin.ignore(1024,\n'))因此,它知道如何进入下一行输入。您应该将cin读入一个std::字符串,然后从那里开始验证。首先,请检查该值是否为数字。以下是解决问题的两条建议: 将错误处理添加到cin 读取为字符串并进行解析 常见的解决方案是字符串和解析,但我将两者都呈现给您选择 将错误处理添加到cin 当流提取函数接收到不适合数字的字符时,它会设置一个fail位。您需要检查流的状态(cin)是否失败。如果要继续,需要清除错误
cin
置于错误状态并保留这些字符。您需要忽略它们(cin.ignore(1024,\n')
)因此,它知道如何进入下一行输入。您应该将cin
读入一个std::字符串,然后从那里开始验证。首先,请检查该值是否为数字。以下是解决问题的两条建议:
将错误处理添加到cin
读取为字符串并进行解析
常见的解决方案是字符串和解析,但我将两者都呈现给您选择
将错误处理添加到cin
当流提取函数接收到不适合数字的字符时,它会设置一个fail
位。您需要检查流的状态(cin
)是否失败。如果要继续,需要清除错误状态
可以使用fail
方法检查状态:cin.fail()
。要清除状态,请使用:cin.clear()
看
读取为字符串并进行解析
另一种方法是将输入作为字符串读取,然后为数据解析字符串。string
容器有一些有用的解析方法
使用getline
读取cin
中的字符串
变量
同样,您必须编写代码来检查错误并进行处理。您需要使用fail()
检测不可转换的输入,然后忽略其余的坏数据,并在读取新的输入尝试之前使用clear()
重置cin
错误标志
int selection = -1;
while (!(selection >= 1 && selection <=4))
{
cin >> selection;
if (cin.fail() || !(selection >= 1 && selection <=4))
{
cout << "invalid selection!" << endl;
cout << "selection: ";
cin.clear();
cin.ignore(std::numeric_limits<int>::max(), '\n');
}
}
int-selection=-1;
而(!(选择>=1&&selection>selection;
如果(cin.fail()| |!(selection>=1&&selection您需要检查cin
的条件,如果是任何错误状态,您应该清除错误标志并忽略()
:
注意:您可能需要将cin.ignore();
放在getline()
调用之后-这取决于您是否正在读取所有未格式化的输入。我应该如何使用此ignore?cin.ignore(1024)是什么意思?特别是1024部分。这告诉我们忽略接下来的1024个字符,这是错误的,因为接下来的1024个字符将被忽略。可能您想使用cin.ignore(1024,“\n”),它告诉我们忽略所有字符,直到找到换行符或忽略1024个字符为止。事实上,只忽略换行符。
int main()
{
int selection = -1;
while (!(selection >= 1 && selection <=4))
{
if (cin >> selection)
{
if (!(selection >= 1 && selection <=4))
{
cout << "invalid selection!" << endl;
cout << "selection: ";
}
}
else
{
cin.clear();
cin.ignore();
}
}
cout << selection << " selected\n";
return 0;
}
int main()
{
int selection = -1;
while (!(selection >= 1 && selection <=4))
{
string line;
getline(cin, line);
stringstream sstr(line);
if (sstr >> selection)
{
if (!(selection >= 1 && selection <=4))
{
cout << "invalid selection!" << endl;
cout << "selection: ";
}
}
else
{
cout << "invalid input!" << endl;
cout << "selection: ";
}
}
cout << selection << " selected\n";
return 0;
}