此程序在指定范围内打印指定数量的数字。然而,当我输入一个角色时,它无休止地循环我所做的任何循环循环。例如:如果我在“输入最大数量”cin中输入一个字符,它只是无限地发送“输入最大数字”,它只是跳过cin和循环cout(同样适用于其他2个do-whiles。任何人都知道为什么?
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int roll(int mini, int maxi)
{
int v = maxi - mini;
int x = mini + (rand() % (v+1));
return x;
}
void caller()
{
int a;
int b;
int c;
do {
cout << "Enter minimum number" << endl;
cin.clear();
cin >> a;
} while (cin.fail());
do {
cout << "Enter maximum number" << endl;
cin.clear();
cin >> b;
} while (cin.fail() || a > b);
do {
cout << "How many rolls?" << endl;
cin.clear();
cin >> c;
} while (cin.fail());
for (int i = 0; i < c; i++)
cout << roll(a, b) << endl;
}
int main()
{
srand (time(NULL));
caller();
return 0;
}
答案 0 :(得分:2)
我不想使用istream::fail()
进行循环控制。有关类似问题,请参阅Why is iostream::eof inside a loop condition considered wrong?。
相反,我依赖istream::operator >>
的返回值。
我还使用以下函数重置标志并清除输入流上的输入:
void flush_stream(std::istream& stream)
{
stream.clear();
stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
有关详情,请参阅How do I flush the cin buffer?。
因此我会对您的输入检查进行编码:
int get_valid_number(const std::string& prompt)
{
int number = 0;
bool valid = false;
while (!valid)
{
std::cout << prompt << std::endl;
if (std::cin >> number)
{
valid = true;
}
flush_stream(std::cin);
}
return number;
}
希望将其提取到函数中的好处是显而易见的。 See it run
答案 1 :(得分:2)
您可以尝试做类似
的事情int a;
string trash;
do {
cout << "Enter minimum number" << endl;
cin >> a;
if(cin.fail()){
cin.clear();
cin >> trash;
}
} while (cin.fail());
这将通过将其输入trash
字符串来删除cin流中的任何错误输入。
此链接可帮助您更好地了解这些cin
功能。