【问题标题】:std::cin not functioning within do-while loopstd::cin 在 do-while 循环中不起作用
【发布时间】:2014-10-19 19:35:09
【问题描述】:

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

我在我的代码中看不到是什么原因造成的,我很困惑。

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

#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');
   }

【问题讨论】:

  • 你试过在调试器中运行吗?提示:首先发生什么,读取数字,还是跳过一行?
  • 是的,我已经多次通过调试器运行它。它会打印我的输入请求,然后一旦我输入输入并按下输入,它就会继续等待输入。不是clear()函数,我已经把它注释掉了,重新构建了我的项目,问题还是出现了。
  • 您可能想要更彻底地测试您的“更正”代码(使用错误的输入和良好的输入)。我怀疑它是否在所有情况下都符合您的要求。
  • 哇,谢谢本。我猜对我来说是艰难的一天。我现在修好了(我想)。

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


【解决方案1】:

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

您稍后在选择随机数时也会出错...

int randomNumber = rand() % maxRange + minRange;

应该是:

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

获得minRangemaxRange 的范围。

【讨论】:

  • 谢谢!您对忽略功能是正确的。我将它包装在一个 if 语句中。另外,我直接从 API 中获取了用于生成随机数的代码,这里是:cplusplus.com/reference/cstdlib/rand/?kw=rand,它按原样工作。
  • % 运算符后面的值给出了范围的 size,而不是结束。
  • 哇,好眼力。先生,您确实是正确的。我重新运行了我的代码几次,但都失败了。
猜你喜欢
  • 2021-03-04
  • 1970-01-01
  • 2013-05-06
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2022-12-12
  • 1970-01-01
相关资源
最近更新 更多