使用cin-C ++的良好输入验证循环

时间:2010-01-16 01:51:52

标签: c++ loops validation

我正处于我的第二个OOP课程中,我的第一堂课是用C#教授的,所以我是C ++的新手,目前我正在使用cin练习输入验证。所以这是我的问题:

这个循环是否构建了一种验证输入的好方法?或者有更常见/可接受的方式吗?

谢谢!

代码:

int taxableIncome;
int error;

// input validation loop
do
{
    error = 0;
    cout << "Please enter in your taxable income: ";
    cin >> taxableIncome;
    if (cin.fail())
    {
        cout << "Please enter a valid integer" << endl;
        error = 1;
        cin.clear();
        cin.ignore(80, '\n');
    }
}while(error == 1);

4 个答案:

答案 0 :(得分:29)

我不喜欢为iostream打开异常。 I / O错误不够特别,因为错误通常很可能。我更喜欢在不常见的错误条件下使用异常。

代码也不错,但跳过80个字符有点随意,如果你操纵循环则不需要错误变量(如果你保留它就应该是bool)。您可以将cin的读取直接放入if,这可能更像是Perl习语。

这是我的看法:

int taxableIncome;

for (;;) {
    cout << "Please enter in your taxable income: ";
    if (cin >> taxableIncome) {
        break;
    } else {
        cout << "Please enter a valid integer" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}

除了只跳过80个字符外,这些只是轻微的狡辩,而且更像是首选的风格。

答案 1 :(得分:5)

int taxableIncome;
string strInput = "";
cout << "Please enter in your taxable income:\n";

while (true) 
{
    getline(cin, strInput);

    // This code converts from string to number safely.
    stringstream myStream(strInput);
    if ( (myStream >> taxableIncome) )
        break;
    cout << "Invalid input, please try again" << endl;
}

所以你看到我使用字符串输入然后将其转换为整数。这样,有人可以键入enter,'mickey mouse'或者其他任何东西,它仍会响应 另外#include <string><sstream>

答案 2 :(得分:2)

你可能不会考虑尝试/捕获,只是为了让你习惯于异常处理的概念?

如果没有,为什么不使用布尔值而不是0和1?养成使用正确类型的变量(以及在需要时创建类型)的习惯

Cin.fail()也在http://www.cplusplus.com/forum/beginner/2957/

进行了讨论

事实上,在很多地方......

http://www.google.com.sg/#hl=en&source=hp&q=c%2B%2B+tutorial&btnG=Google+Search&meta=&aq=f&oq=c%2B%2B+tutorial

你可能会研究其中的一些,并尝试按照解释为什么应该以某种方式完成事情。

但是,迟早,你应该理解例外......

答案 3 :(得分:2)

一个小问题是错误辅助变量是完全冗余的,不需要:

do
{
    cin.clear();
    cout << "Please enter in your taxable income: ";
    cin >> taxableIncome;
    if (cin.fail())
    {
        cout << "Please enter a valid integer" << endl;
        cin.ignore(80, '\n');
    }
}while(cin.fail());