2

2つのユーザー定義ベクトルを比較して、それらが等しいかどうか、現在のコードを確認しようとするだけです。

vector<int> ivec1, ivec2; //vectors, uninitialized

int temp1;

cout << "Enter integers to be stored in ivec1." << endl;

while(cin >> temp1) //takes input from user and creates new element in the vector to store it
{
    ivec1.push_back(temp1);
}

int temp2;

cout << "Enter integers to be stored in ivec2." << endl;

while(cin >> temp2) //same as above with different vector
{
    ivec2.push_back(temp2);
}

if(ivec1 == ivec2)
    cout << "ivec1 and ivec2 are equal!" << endl;
else
    cout << "ivec1 and ivec2 are NOT equal!" << endl;

これまでのところ、ivec1に値をうまく割り当てることができますが、文字を入力してcinを失敗させることで、whileループを終了すると、2番目のwhileブロックがスキップされます。好奇心から、最初のwhileループの後に他のcinステートメントを入れてみましたが、それらもすべて無視されます。

cinを強制的に失敗させると、プログラムはそれまたは何かに対する他のすべての呼び出しを無視しますか、それとも別の問題がありますか?もしそうなら、どうすればこのプログラムに私が望むことをさせることができますか?

閲覧を楽しむためのスクリーンショット:http: //img695.imageshack.us/img695/2677/cinfailure.png

*PS。temp1とtemp2があるのは、両方の割り当てループに同じintを使用することが問題の原因であるかどうかを判断しようとしただけでした。とにかく、そのままにしておくと思いました。

4

5 に答える 5

4

cin.clear()ストリームの状態をリセットするために行う必要があります。次に、問題のある文字がストリームから読み取られていることを確認する必要があります(ここで説明する手法のいずれかを使用して)。これにより、次の入力操作も失敗しません。

于 2011-07-28T14:58:53.007 に答える
1

これは、最初のループにファイルの終わりを与えるためにctrl-Dを実行していることを意味します。

これに伴う問題は、EOFが達成されるとそれが持続し、2番目のループもEOFを確認し、何も読み取らないことです。

代わりに、空白行や「。」などの終了文字を使用してください。具体的には、代わりにおもちゃのwhileループでテストしますwhile (cin >> tmp1)

于 2011-07-28T14:58:55.187 に答える
1

cin.clear()ループ間で使用します。このコマンドは、ストリームの状態を使用可能な状態にリセットします。

ループを終了するために常に無効な文字を入力する必要はないことを知っておくと役立つ場合があります。コンソールでctrl-z(他のシステムではctrl-d)を使用してEOFを刺激することもできます(Windowsの場合)。 。あなたはまだそうしなければならないでしょうcin.clear()(EOFはまだストリームを無効にするので)-しかしそれはそれほど危険ではありません

于 2011-07-28T14:59:21.450 に答える
0

の失敗により最初の whileループが終了するとstd::cin、内部的に失敗フラグも設定されます。最初のループのに次のように記述して、そのフラグをクリアする必要があります。while

scin.clear();

それはすべての失敗フラグをクリアするので、それcinはさらなる入力を読み取るために使用することができます。

于 2011-07-28T14:59:42.410 に答える
0

同じ問題に取り組んでいたときにこれを見つけました。ループ間にストリームを追加cin.clear()cin.ignore()てリセットし、「cin」呼び出しを再度認識させる必要がありました。

于 2016-09-28T14:09:38.700 に答える