C ++ if(!cin)导致循环

时间:2014-05-17 21:43:46

标签: c++ cin

我尝试使用if(!cin)来验证用户输入是否真的是整数。然而,我的程序然后进入一个无限循环,从不问新的输入

do{
    cin >> temp->data;
    if(!cin){
        cout << "Please enter a Number!" << '\n';
        correct=false;
        }
   }while(correct==false);

如果有人可以帮助我,那会很棒。)

5 个答案:

答案 0 :(得分:3)

当std :: cin无法读取输入时,会设置相应的错误标志。因此,您希望使用std :: cin.clear()重置标志,以便下一个输入操作正常工作,然后跳过所有内容,直到新行使用std :: cin.ignore(..)以避免类似格式化输入。

while (!(std::cin >> temp->data))
{
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "\nPlease enter a number!" << std::endl;
}

std::numeric_limits<std::streamsize>::max()返回流可以容纳的最大字符数,以确保忽略整行。

答案 1 :(得分:0)

使用cin.fail()检查用户是否输入了正确的输入。如果最后cin.fail()命令失败,则true返回cin,否则返回false。此外,您的循环可能是无限的,因此您还必须说明else,其中您将检查标记correct设置为true。因此,要使循环条件无效并在用户输入正确输入的情况下退出循环(参见下面的代码):

do{
    cin >> temp->data;
    if(cin.fail()){
        cin.clear();
        cin.ignore(10000, '\n');
        cout << "Please enter a Number!" << '\n';
        correct=false;
     } else {
        correct=true;
     }
}while(correct==false);

答案 2 :(得分:0)

如果您想进行此类检查,请将cin的数据读取到string并将string转换为数字:

string str;
do{
    cin >> str;
    if(!cin){
        cout << "Please enter a Number!" << '\n';
        correct=false;
        }
    else{
        istringstream stream(str);
        stream >> temp->data;
        if(!stream){
            cout << "Please enter a Number!" << '\n';
            correct=false;
        }
     }

   }while(correct==false);

答案 3 :(得分:0)

你的纠正&#39;变量实际上并没有像你使用它那样做任何事情。如果correct为真,则无法退出循环;所以你可以取消它,只需在读完数字时使用循环退出命令。

此外,到目前为止发布的答案都没有处理输入被关闭。在那种情况下,它们将进入无限循环。

// A loop; we will break out when we successfully read a number.
while ( 1 )
{
// Prompt for a number and read it
    cout << "Please enter a Number!" << endl;
    cin >> temp->data;

// Exit loop if we successfully read
    if ( cin )
         break;

// Check to see if we failed due to the input being closed
    if ( cin.eof() )
    {
        cerr << "End of input reached.\n";
        return 0;   // depends what your function returns of course
    }

// reset the error condition that was caused by trying to read an integer and failing
    cin.clear();

// discard anything they previously typed
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

从此开始,一个好的设计就是让这段代码本身就是一个完整的功能。然后,您可以在需要安全地获取号码时调用该函数,而无需重复代码。函数声明可能是:

void input_number(int &the_number, std::istream &in, std::string prompt);

将输出the_number,它将通过抛出异常或依靠调用者检查!cin或甚至返回{{1}来处理文件结束}};无论你的整体错误处理最适合什么。

答案 4 :(得分:0)

例如,如果您在!语句中的条件之前放置“ if”。应该是“非”运算符。