2

SO私はこのコードを持っています:

#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 を入力すると、「大きすぎる」が 1 回だけ繰り返されることに気付きました。私が気づいていないことがありますか?またはコードに欠陥がありますか?

どうもありがとう :)

4

3 に答える 3

6

データ型を見ると、int最大 2,147,483,647 1しか保持できないことがわかります。データ型が保持できるよりも大きな数値を入力しようとすると、std::cout失敗し、次のループで再度処理を試みますが、これも失敗し、無限ループに陥ります。

より大きなデータ型を使用して問題を解決できます。


1 - int のサイズはマシンによって異なります。int が保持できる範囲のリストについては、http://en.cppreference.com/w/cpp/language/typesを確認してください。

于 2013-01-19T15:11:17.233 に答える
1

このコードが常に成功することを期待しています:

cin>>guess;

std::ios_baselikeから派生した型std::cinは、エラー状態になる場合があります。

boolコンテキストでストリームを使用することにより、これを完全に処理し始めることができます。

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

何が起こっているのか正確に知りたい場合は、この cplusplus.com スレッド をチェックしてくださいstd::cin。2番目のポスター「int main」は、それを非常にうまくまとめています(SO用に少し再フォーマットされています):

cin.fail()入力された値が変数で定義された値に適合するかどうかを検出します。しかし、cin.fail()が true の場合、次のことを意味します。

  • 入力された値が変数に適合しません
  • 変数は影響を受けません
  • インストリームはまだ壊れています
  • 入力された値はまだバッファ内にあり、次のcin >> variableステートメントに使用されます。

したがって、次のことを行う必要があります。

  • インストリームを修復するcin.clear()
  • でバッファをクリアしますcin.ignore(std::numeric_limits<int>::max(), '\n')

私は今でもこの振る舞いが奇妙で直感に反していると思いますが、少なくとも現在何が起こっているかを知っています.

注:少なくとも私のシステム(g ++ 4.6)では、「変数は影響を受けません」というステートメントは当てはまりません。実際、変数は可能な最大値に設定されています。入力された値をストリームに残すと、さらに説明が難しくなります...

于 2013-01-19T15:43:56.723 に答える