5

わかりましたので、C++ iostream には非常に奇妙に感じるいくつかの問題がありますが、これは MSVC++ と G++ の両方で発生することを考えると、おそらく定義された動作です。

このプログラムがあるとします:

#include <iostream>
using namespace std;

int main()
{
   int a;
   cin >> a;
   cout << a << endl;
   cin >> a;
   cout << a << endl;

   return 0;
}

最初の cin に int の最大制限より大きい値を指定して意図的にオーバーフローさせた場合、それ以降のすべての呼び出しcin.operator>>()は何らかの理由ですぐに返され、a何らかの値に設定されます。値は未定義のようです。

この動作はなぜ、どこに文書化されていますか? このようなオーバーフローが発生したかどうかを確認する方法はありますか?

また、この同様のプログラムは意図したとおりに動作するようです。値をオーバーフローすると、a何らかの値が得られ、オーバーフローが発生しなかったかのように続行します。

#include <cstdio>
using namespace std;

int main()
{
   int a;
   scanf("%d", &a);
   printf("%d\n", a);
   scanf("%d", &a);
   printf("%d\n", a);
   scanf("%d", &a);
   printf("%d\n", a);

   return 0;
}
4

3 に答える 3

7

iostreams は、エラーを検出してエラー状態になるように設計されています。整数オーバーフローからは、数値以外の文字列を入力した場合と同じ結果が得られます。

cin(または任意のストリーム) にキャストするか、エラーが発生したかどうboolかを確認します。cin.rdstate()

cin.clear()andを呼び出しcin.ignore()て、エラーをフラッシュします。失敗した文字のポイントでピックアップします。

公式ドキュメントに関しては、残念ながら標準は iostreams の腸内で少し不可解になります。§27.6.1.2.1、27.6.1.2.2、および 22.2.2.1.1/11 を参照してください (冗談ではありません)。

— ステージ 2 で蓄積された一連の文字が原因で、scanf が入力エラーを報告していました。ios_base::failbit は err に割り当てられます。

scanfのドキュメントも同様に難解であり、オーバーフローはエラーであると信じています。

于 2010-08-27T08:43:11.930 に答える
1

無効な読み取りのためにcinがエラー状態に設定されていると思います。

ここでの最初の返信で説明しています。

http://www.dreamincode.net/forums/topic/93200-cin-checking-and-resetting-error-state/

このコードを試してみたところ、失敗状態に設定されているようです

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    if(!cin)
    {
        cin.clear();
    }
    cout << a << endl; 
    cin >> a; 
    if(!cin)
    {
        cin.clear();
    }
    cout << a << endl; 

    return 0; 
}
于 2010-08-27T08:42:57.457 に答える
0

aは未定義の値から始まります。cinのせいじゃない。試す:

if (cin >> a) {
  cout << a endl;
}

使用する前に、読み込みがa成功したかどうかを確認しますa

于 2010-08-27T08:44:14.877 に答える