gpt4 book ai didi

c++ - do-while 无限循环 cout,忽略 cin

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:26 24 4
gpt4 key购买 nike

此程序打印指定范围内指定数量的数字。但是,当我输入一个字符时,它只会无休止地循环我在其中执行的任何 do-while 循环。例如:如果我在“输入最大数字”cin 中输入一个字符,它只会无休止地发送垃圾邮件“输入最大数字”,它只是跳过cin 并循环 cout(其他 2 个 do-while 也是如此。有人知道为什么吗?

#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() 进行循环控制。参见 Why is iostream::eof inside a loop condition considered wrong?对于类似的问题。

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

我还使用以下函数来重置标志并清除输入流上的输入:

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

参见 How do I flush the cin buffer?有关更多信息。

所以我会这样编写您的输入检查代码:

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

希望将其提取到函数中的好处是显而易见的。 See it run .

关于c++ - do-while 无限循环 cout,忽略 cin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14907978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com