我有这个代码:
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int x;
x=rand();
int guess;
do{
cout<<"Enter your guess:";
cin>>guess;
if(guess==x)cout<<"You got it ! ;)\n";
else {
cout<<"Wrong(";
if (guess<x) cout<<"too small)\n";
else cout<<"too big)\n";
}
} while (guess != x);
return 0;
}
问题:编译并运行此程序后,我输入“999999999999”并不断重复“太大”。为什么会这样呢?
附加信息:当我将x的值设置为常数10,并且我输入11时,我注意到它只重复“太大”一次。有什么我不知道的吗?或代码是否有缺陷?
非常感谢:)答案 0 :(得分:7)
如果查看data types,您会发现int
最多只能容纳2,147,483,647 1 。当您尝试输入比数据类型所能容纳的数字更大的数字而不是std::cout
失败时,它会在下一个循环中再次尝试并处理它,并且它也会失败并且它会向您发送无限循环。
您可以使用更大的数据类型解决问题。
1 - int的大小取决于您的机器,请检查http://en.cppreference.com/w/cpp/language/types以获取int可以容纳的范围列表
答案 1 :(得分:1)
您希望此代码始终成功:
cin>>guess;
从std::ios_base
派生的类型(例如std::cin
)可能会进入错误状态。
您可以在bool
上下文中使用流来完全处理此问题。
}while (cin && guess != x);
答案 2 :(得分:1)
如果您对正在发生的事情感到好奇,请查看this cplusplus.com thread,其中有人从std::cin
读取太大的数字时遇到非常类似的问题。第二张海报“int main”总结得非常好(为SO重新格式化了一下):
cin.fail()
检测输入的值是否符合定义的值 在变量中。但如果cin.fail()
为真,则意味着:
- 输入的值不适合变量
- 该变量不会受到影响
- 这条河流仍然破碎
- 输入的值仍在缓冲区中,将用于下一个
cin >> variable
语句。因此您必须执行以下操作:
- 通过
修复内流cin.clear()
- 使用
清除缓冲区cin.ignore(std::numeric_limits<int>::max(), '\n')
我仍然觉得这种行为很奇怪且违反直觉,但至少我们知道现在发生了什么。
注意:语句“变量不会受到影响”不成立,至少对我的系统来说是这样(g ++ 4.6)。事实上,该变量设置为最大可能值。这使得在流上输入的值更难以解释...