我的兄弟最近开始学习C++。他告诉我他在尝试验证简单程序中的输入时遇到的问题。他有一个文本菜单,用户输入一个整数choice
,如果他们输入了一个无效的选择,他们会被要求再次输入(while while循环)。但是,如果用户输入的是字符串而不是int,则代码会中断。 我读了计算器的各种问题,并告诉他的线沿线的重写一行代码:用cin在C++中进行输入验证的最佳方式是什么?
#include<iostream>
using namespace std;
int main()
{
int a;
do
{
cout<<"\nEnter a number:"
cin>>a;
if(cin.fail())
{
//Clear the fail state.
cin.clear();
//Ignore the rest of the wrong user input, till the end of the line.
cin.ignore(std::numeric_limits<std::streamsize>::max(),\
'\n');
}
}while(true);
return 0;
}
虽然这工作确定,我也尝试了一些其他的想法:
1.使用try catch块。它没有工作。我认为这是因为由于输入错误而不会引发异常。 2.我试过if(! cin){//Do Something}
哪个也没用。我还没有想出这一个。
3.第三,我尝试输入一个固定长度的字符串,然后解析它。我会用atoi()。这个标准是否符合标准和便携?我应该写我自己的解析函数吗?
4.如果编写一个使用cin的类,但动态地执行这种错误检测,可能通过在运行时确定输入变量的类型,是否会有太多开销?它甚至有可能吗?
我想知道做这种检查的最佳方法是什么,最佳实践是什么?
我想补充一点,虽然我并不是新手写C++代码,但我是新手,需要编写符合标准的良好代码。我试图去清除不好的习惯并学习正确的习惯。如果回答者给出了详细的解释,我将非常感激。
编辑:我看到litb回答了我之前的一个编辑。我将在这里发布代码以供参考。
#include<iostream>
using namespace std;
int main()
{
int a;
bool inputCompletionFlag = true;
do
{
cout<<"\nEnter a number:"
cin>>a;
if(cin.fail())
{
//Clear the fail state.
cin.clear();
//Ignore the rest of the wrong user input, till the end of the line.
cin.ignore(std::numeric_limits<std::streamsize>::max(),\
'\n');
}
else
{
inputCompletionFlag = false;
}
}while(!inputCompletionFlag);
return 0;
}
此代码失败上像 “1asdsdf” 输入。我不知道如何解决这个问题,但是litb已经发布了一个很好的答案。 :)
谢谢你的详细解释litb,但我抬起头,发现Boost不是标准库。鉴于此,如果我可以或者应该坚持提升,那么推出自己的代码会更好吗? – batbrat 2009-02-13 16:44:33