请一点C ++帮忙(重复输出)

时间:2013-01-19 15:07:32

标签: c++

我有这个代码:

#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时,我注意到它只重复“太大”一次。有什么我不知道的吗?或代码是否有缺陷?

非常感谢:)

3 个答案:

答案 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)。事实上,该变量设置为最大可能值。这使得在流上输入的值更难以解释...