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;

获得minRangemaxRange 的范围。

【讨论】:

谢谢!您对忽略功能是正确的。我将它包装在一个 if 语句中。另外,我直接从 API 中获取了用于生成随机数的代码,这里是:cplusplus.com/reference/cstdlib/rand/?kw=rand,它按原样工作。 % 运算符后面的值给出了范围的 size,而不是结束。 哇,好眼力。先生,您确实是正确的。我重新运行了我的代码几次,但都失败了。

以上是关于std::cin 在 do-while 循环中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

std::cin 输入带空格?

std::cin 输入带空格?

c ++中while循环的意外行为

c++中while循环的意外行为

为啥嵌套循环在 laravel 中不起作用

为啥我的主循环在 tkinter 中不起作用?