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:
答案 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');
}