c++ - 为什么循环是无限的?
问题描述
我正在做一些功课并试图使其免受字符输入的影响,但不知何故在里面写一个字符仍然会破坏它,因为它会使循环无限。任何人都可以提出解决方法吗?这是代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
srand( time( NULL ) );
int given = 0;
int imaginarynum = ( std::rand() % 99 ) + 1;
int tries = 0;
std::cout << "Hello! We'regoing to play an easy game! I'm goinng to think of a number between 1-100 and you'll have to guess it! " << std::endl;
std::cout << given << " "<< imaginarynum;
while(given < imaginarynum || given > imaginarynum)
{
std::cin >> given;
bool error = std::cin.fail();
std::cin.clear();
std::cin.sync();
while(error != false)
{
std::cout << "That's not a number!" << std::endl;
std::cin >> given;
bool error = std::cin.fail();
std::cin.clear();
}
if (given < imaginarynum)
{
std::cout << "I thought of a bigger number! " << std::endl;
std::cout << "Guess again!" << std::endl;
tries = tries + 1;
}else if (given > imaginarynum)
{
std::cout << "I thought of a smaller number! " << std::endl;
std::cout << "Guess again!" << std::endl;
tries = tries + 1;
}
else
{`enter code here`
tries = tries + 1;
std::cout << "Good job! " << std::endl << "It took you: " << tries << " Tries!";
}
}
return 0;
}
解决方案
问题是您正在使用两个变量error
while(error != false)
{
std::cout << "That's not a number!" << std::endl;
std::cin >> given;
bool error = std::cin.fail();
std::cin.clear();
}
在循环中,您声明了一个新变量。用声明替换赋值语句
while(error != false)
{
std::cout << "That's not a number!" << std::endl;
std::cin >> given;
error = std::cin.fail();
std::cin.clear();
}
第二个问题是您需要清除缓冲区。例如
#include <limits>
//...
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
循环将如下所示
#include <limits>
//...
while(error != false)
{
std::cout << "That's not a number!" << std::endl;
std::cin >> given;
error = std::cin.fail();
std::cin.clear();
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
}
推荐阅读
- drupal - 如何使用 Flag 将我的所有内容标记为已读?
- node.js - 如何使用 NodeJS 获取 MongoDB 数据以选择选项
- laravel - 在我的 laravel 应用程序中,验证错误不会显示在视图中。我怎样才能实现它?
- python - 融化 pandas DataFrame 并将值用作列?
- excel - 在excel中以随机顺序逗号分隔值查找重复值?
- c++ - 为什么这个函数从迭代器中得到错误的参数?
- clojure - 反射警告 - Clojure/Leiningen 上的 Java 方法错误
- html - :first-child 选择器上已清除的元素
- javascript - Highcharts 列组动态突出显示
- python - How shall I understand this description of how pickling and unpickling work?