如果我输入一个字母,为什么这段代码会陷入无限循环?

时间:2016-04-01 20:12:58

标签: c++

int readUntilValidBaseRead( int &base )
{
base = 0;
while ( base > 9 || base < 2)
{
    cout << "Enter Base: " << endl;
    cin >> base;
    if (base > 1 && base < 10)
    {
        return base;
    }
    else 
    {
        cout << "a valid base number is in the range of 2 to 9 inclusively" << endl;
        base = 0;
    }
}

}

对于我正在做的任务,我需要使用一个函数来获得一个基础,这就是我写的。如果输入任何数字,代码工作正常。如果我输入f,那么代码就会重复

a valid base number is in the range of 2 to 9 inclusively 
   Enter Base:

3 个答案:

答案 0 :(得分:1)

您需要检查此声明的结果或状态:

cin >> base;

如果输入不是数字,则会失败。输入失败时base的值未定义。

试试这个:

if (cin >> base)
{
  // User input a valid number
}

答案 1 :(得分:0)

这是因为如果你没有输入可以解析为整数的输入,那么输入将不被提取并将保留在输入缓冲区中,因此循环的下一次迭代将读取与之前完全相同的输入迭代并再次遇到同样的问题。

这就是我建议您使用std::getline将整行读入字符串,然后使用std::istringstream尝试提取/解析数据的原因。

您还需要记住,大多数输入(和输出)操作都会返回对流的引用,并且它可以是used as a boolean expression,因此您可以使用类似

的内容
std::istringstream is(someString);
if (is >> base)
{
    // Successfully read and parsed an integer
}
else
{
    // Some error occurred
}

答案 2 :(得分:0)

输入一个字母会导致=== RUN TestPubSubRereadForDemo --- FAIL: TestPubSubRereadForDemo (6.32s) pubsubintg_test.go:147: failed to pull message from iterator: context deadline exceeded FAIL 对象陷入错误状态,无论您之后提供什么,都无法读取基数。

您有两种方法可以解决这个问题。

你可以检查&amp;发生错误后清除错误,如下所示:

cin

或者您可以一次读取整行,并解析数字行:

if(!std::cin) {
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}