2

所以我有这个代码:

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

非常感谢 :)

4

3 回答 3

6

如果查看数据类型,您会发现 anint最多只能容纳 2,147,483,647 1。当您尝试输入的数字大于您的数据类型可以容纳的数字时std::cout,它会在下一个循环中再次尝试并处理它,这也会失败,它会将您发送到无限循环中。

您可以通过使用更大的数据类型来解决您的问题。


1 - int 的大小取决于您的机器,请查看http://en.cppreference.com/w/cpp/language/types以获取 int 可以容纳的范围列表

于 2013-01-19T15:11:17.233 回答
1

您期望此代码始终成功:

cin>>guess;

std::ios_base从like派生的类型std::cin可能会进入错误状态。

bool您可以通过在上下文中使用流来开始完全处理这个问题。

}while (cin && guess != x); 
于 2013-01-19T15:22:46.120 回答
1

如果您对到底发生了什么感到好奇,请查看这个 cplusplus.com 线程,其中有人在从std::cin. 第二张海报“int main”很好地总结了它(为 SO 重新格式化了一下):

cin.fail()检测输入的值是否符合变量中定义的值。但如果cin.fail()为真,则意味着:

  • 输入的值不适合变量
  • 变量不会受到影响
  • 内流仍然损坏
  • 输入的值仍在缓冲区中,将用于下cin >> variable一条语句。

因此,您必须执行以下操作:

  • 通过修复内流cin.clear()
  • 清除缓冲区cin.ignore(std::numeric_limits<int>::max(), '\n')

我仍然觉得这种行为很奇怪和违反直觉,但至少我们知道现在发生了什么。

注意: “变量不会受到影响”的说法是不正确的,至少对于我的系统(g++ 4.6)。该变量实际上设置为最大可能值。这使得将输入的值留在流中更加难以解释......

于 2013-01-19T15:43:56.723 回答