在无休止地循环cout时执行,忽略cin

Do-while endlessly looping cout, ignores cin

本文关键字:执行 忽略 cin cout 无休止 循环      更新时间:2023-10-16

此程序在指定范围内打印指定数量的数字。然而,当我输入一个字符时,它只是无休止地循环,无论我在循环中输入哪个字符。例如:如果我在"输入最大值"cin中输入一个角色,它就会无休止地发送"输入最大数",它就会跳过cin并循环cout(其他两个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;
}

我不喜欢使用istream::fail()进行循环控制。请参阅为什么循环条件中的iostream::eof被认为是错误的?对于类似的问题。

相反,我依赖于istream::operator >>的返回值。

我还使用以下功能重置标志并清除输入流上的输入:

void flush_stream(std::istream& stream)
{
    stream.clear();
    stream.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}

请参阅如何冲洗cin缓冲液?了解更多信息。

所以我会这样编码你的输入检查:

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;
}

希望将其提取到函数中的好处是显而易见的。看它跑。

你可以尝试做一些类似的事情

int a;
string trash;
do {
  cout << "Enter minimum number" << endl;
  cin >> a;
  if(cin.fail()){
    cin.clear();
    cin >> trash;
  }
} while (cin.fail());

这将通过将cin流放入trash字符串来删除任何错误输入。

此链接可能有助于您更好地理解这些cin函数。

http://web.eecs.utk.edu/~cs102/讲座/cin讲座.html