做 - 无休止地循环cout,忽略cin

时间:2013-02-16 07:18:21

标签: c++ infinite-loop do-while

此程序在指定范围内打印指定数量的数字。然而,当我输入一个角色时,它无休止地循环我所做的任何循环循环。例如:如果我在“输入最大数量”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;
}

2 个答案:

答案 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功能。

http://web.eecs.utk.edu/~cs102/lectures/cinLecture.html