在无休止地循环cout时执行,忽略cin
Do-while endlessly looping cout, ignores cin
此程序在指定范围内打印指定数量的数字。然而,当我输入一个字符时,它只是无休止地循环,无论我在循环中输入哪个字符。例如:如果我在"输入最大值"cin中输入一个角色,它就会无休止地发送"输入最大数",它就会跳过cin并循环cout(其他两个do-whiles也是如此。有人知道为什么吗?
#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()
进行循环控制。请参阅为什么循环条件中的iostream::eof被认为是错误的?对于类似的问题。
相反,我依赖于istream::operator >>
的返回值。
我还使用以下功能重置标志并清除输入流上的输入:
void flush_stream(std::istream& stream)
{
stream.clear();
stream.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}
请参阅如何冲洗cin缓冲液?了解更多信息。
所以我会这样编码你的输入检查:
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;
}
希望将其提取到函数中的好处是显而易见的。看它跑。
你可以尝试做一些类似的事情
int a;
string trash;
do {
cout << "Enter minimum number" << endl;
cin >> a;
if(cin.fail()){
cin.clear();
cin >> trash;
}
} while (cin.fail());
这将通过将cin流放入trash
字符串来删除任何错误输入。
此链接可能有助于您更好地理解这些cin
函数。
http://web.eecs.utk.edu/~cs102/讲座/cin讲座.html
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 在fstream期间忽略空行
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 概念TS检查忽略私有访问修饰符
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- C++宏忽略之后的内容
- 如何忽略某些二进制文件的执行?
- 可执行文件忽略rpath条目
- boost::asio-signal_set处理程序仅在捕获第一个信号后执行,并忽略相同类型的连续信号
- 如何仅执行 qgraphicsitem 的鼠标事件?(忽略 qGraphicsView 的其余 mouseevent)
- 在无休止地循环cout时执行,忽略cin