函数require()中的循环需要3个条件,a> b或“a”或“b”不是数字。即使我不满足条件并将2个整数放入其中,它也会再次循环。
当我输入一个字符时,它只是无休止地循环“输入最小数字输入最大数字”忽略了这些字符。谁知道为什么?我是初学者,所以这可能很明显
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int random(int minN, int maxN) //generates random number within specified range
{
srand (time(NULL));
int x = (maxN - minN);
int y = minN + (rand() % (x+1));
return y;
}
int require() //makes sure a < b and both are digits
{
int a,b;
do {
cout << "Enter minimum number" << endl;
cin >> a;
cout << "Enter maximum number. Note: Has to be greater or equal to minimum." << endl;
cin >> b;
} while (a > b || !isdigit(a) || !isdigit(b));
return random(a,b);
}
int main()
{
cout << require() << endl;
}
答案 0 :(得分:1)
您正在读取数字,因为数字不是isdigit
函数所期望的字符数。如果您使用符合C ++ 11的标准库,如果输入不是有效的整数,则a
和b
的值实际上将为零,这意味着,例如!isdigit(a)
将为true
。如果您使用的是非C ++ 11库,那么a
和b
的值将是随机的,并且很可能会导致!isdigit(a)
为真,以及金额完整32位整数范围内的有效数字ASCII值非常小。
如果您阅读有关输入运算符的引用,例如this one,您将看到如果提取失败,则将设置流failbit
。这可以像这样“内联”测试:
if (!(std::cin >> a))
{
std::cout << "Not a valid number, try again: ";
continue;
}
或者可以使用流fail
函数进行测试。
答案 1 :(得分:1)
您不应该使用isdigit
,因为这与特定字符相关。相反,循环应如下所示:
int require() //makes sure a < b and both are digits
{
validNumbers = true;
do
{
cout << "Enter minimum number" << endl;
cin.clear();
cin >> a;
} while (cin.fail());
do
{
cout << "Enter maximum number. Note: Has to be greater or equal to minimum."
<< endl;
cin.clear();
cin >> b;
} while (cin.fail() || a > b);
return random(a,b);
}
PS:您只需在程序开始时拨打srand (time(NULL));
一次。