输入的整数验证

时间:2013-06-05 07:42:45

标签: c++ validation while-loop

我试图提示用户输入并进行验证。例如,我的程序必须输入3个用户输入。一旦它达到非整数,它将打印错误消息并再次提示输入。以下是我的程序在运行时的样子:

  

输入数字:a

     

输入错误

     

输入数字:1

     

输入数字:b

     

输入错误

     

输入数字:2

     

输入数字:3

     

输入的数字是1,2,3

这是我的代码:

double read_input()
{
    double input;
    bool valid = true;
    cout << "Enter number: " ;
    while(valid){
        cin >> input;
        if(cin.fail())
        {
            valid = false;
        }
    }
    return input;
}

我的主要方法:

int main()
{
double x = read_input();
double y = read_input();
double z = read_input();
}

当我的第一个输入是非整数时,程序就会自行退出。它不再要求提示。我怎么能修好它?或者我应该使用do while循环,因为我要求用户输入。

提前致谢。

3 个答案:

答案 0 :(得分:7)

当阅读失败时,您将valid设置为false,因此while循环中的条件为false,程序返回input(其中顺便说一下,没有初始化。

您还必须在再次使用之前清空缓冲区,例如:

#include <iostream>
#include <limits>

using namespace std;

double read_input()
{
    double input = -1;
    bool valid= false;
    do
    {
        cout << "Enter a number: " << flush;
        cin >> input;
        if (cin.good())
        {
            //everything went well, we'll get out of the loop and return the value
            valid = true;
        }
        else
        {
            //something went wrong, we reset the buffer's state to good
            cin.clear();
            //and empty it
            cin.ignore(numeric_limits<streamsize>::max(),'\n');
            cout << "Invalid input; please re-enter." << endl;
        }
    } while (!valid);

    return (input);
}

答案 1 :(得分:0)

你的问题确实让自己陷入了其他问题,例如在失败时清除cin() -

double read_input()
{
double input;
int count = 0; 
bool valid = true;
while(count != 3) {
    cout << "Enter number: " ;
    //cin.ignore(); 
    cin >> input; 
    if(cin.fail())
    {
        cout << "Wrong Input" <<endl;
        cin.clear(); 
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    }
    else 
            count++;
}
return input;
}

答案 2 :(得分:0)

问题出在while条件

bool valid = true;
while(valid){

你循环直到你得到一个无效的输入,这绝对不是你想要的!循环条件应该是这样的

bool valid = false;
while(! valid){ // repeat as long as the input is not valid

以下是read_double

的修改版本
double read_input()
{
    double input;
    bool valid = false;
    while(! valid){ // repeat as long as the input is not valid
        cout << "Enter number: " ;
        cin >> input;
        if(cin.fail())
        {
            cout << "Wrong input" << endl;

            // clear error flags
            cin.clear(); 
            // Wrong input remains on the stream, so you need to get rid of it
            cin.ignore(INT_MAX, '\n');
        }
        else 
        {
            valid = true;
        }
    }
    return input;
}

在您的主要内容中,您需要根据需要提出双打要求,例如

int main()
{
    double d1 = read_input();
    double d2 = read_input();
    double d3 = read_input();

    cout << "Numbers entered are: " << d1 << ", " << d2 << ", " << d3 << endl;

    return 0;
}

您可能还希望有一个循环,您可以在其中调用read_double()并将返回的值保存在数组中。