std :: cin在do-while循环中不起作用

时间:2014-10-19 19:35:09

标签: c++ visual-studio c++11

我正在尝试创建一个读取范围限制的简单程序,然后在这些范围之间创建一个随机数。一切都在我的程序中运行,但是当我运行代码时,第一条消息打印给用户,然后我输入我的最大范围,按回车键,光标移动到下一行,仍然要求输入。

我的代码中没有看到导致这种情况的原因,我很难过。

到目前为止,这是我的代码:

#include<iostream>
#include<limits>

using std::cout;
using std::cin;
using std::endl;

int main(){

    int maxRange; //to store the maximum range of our random numbers

    do {
       cout << "Please enter a maximum range \n";
       //use clear funtion to clear the fail bit
       cin.clear();
       //use ignore function to avoid bad input
       cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    } while(!(cin >> maxRange)); //continue loop if cin fails

    int minRange; //to store the minimum range of random numbers

    do {
       cout << "Please enter a minimum range \n";
       //use clear funtion to clear the fail bit
       cin.clear();
       //use ignore function to avoid bad input
       cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    } while(!(cin >> minRange)); //continue loop if cin fails

    int randomNumber = rand() % maxRange + minRange;

    cout << "The random number that you have generated is: " << randomNumber << endl;

    return 0;
}

编辑: 问题是忽略功能。这是我纠正的循环的工作代码:

if(!(cin)){
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
   }

1 个答案:

答案 0 :(得分:3)

在尝试读取循环条件中的值之前,第一个cin.ignore()循环中的do..while()会丢弃您的第一行输入。如果您输入两次最大范围,您的程序会(某种程度)工作,因为它成功读取了第二行。也许在第一个循环中删除cin.ignore()行。

稍后您在选择随机数时也会出现错误,但是......

int randomNumber = rand() % maxRange + minRange;

应该是:

int randomNumber = rand() % (1 + maxRange - minRange) + minRange;

获得minRangemaxRange的范围。