std::cin 在 do-while 循环中不起作用
Posted
技术标签:
【中文标题】std::cin 在 do-while 循环中不起作用【英文标题】:std::cin not functioning within do-while loop 【发布时间】: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()函数,我已经把它注释掉了,重新构建了我的项目,问题还是出现了。 您可能想要更彻底地测试您的“更正”代码(使用错误的输入和良好的输入)。我怀疑它是否在所有情况下都符合您的要求。 哇,谢谢本。我猜对我来说是艰难的一天。我现在修好了(我想)。 【参考方案1】:第一个do..while()
循环中的cin.ignore()
在尝试读取循环条件中的值之前会丢弃您的第一行输入。如果您两次输入最大范围,您的程序确实(有点)工作,因为它成功读取了第二行。也许删除第一个循环中的cin.ignore()
行。
您稍后在选择随机数时也会出错...
int randomNumber = rand() % maxRange + minRange;
应该是:
int randomNumber = rand() % (1 + maxRange - minRange) + minRange;
获得minRange
到maxRange
的范围。
【讨论】:
谢谢!您对忽略功能是正确的。我将它包装在一个 if 语句中。另外,我直接从 API 中获取了用于生成随机数的代码,这里是:cplusplus.com/reference/cstdlib/rand/?kw=rand,它按原样工作。%
运算符后面的值给出了范围的 size,而不是结束。
哇,好眼力。先生,您确实是正确的。我重新运行了我的代码几次,但都失败了。以上是关于std::cin 在 do-while 循环中不起作用的主要内容,如果未能解决你的问题,请参考以下文章