0

終了条件が一致すると、なぜこのwhileループが停止しないのか理解できませんか?

アイデアは、ユーザーが5桁の整数を入力し、入力プロセスを終了するために他の何かを入力できるというものです。だが

bool noerror(true);
int n(0),part2temp;
vector<int> part2;

while(noerror){
    cout << "Please enter the 5 integer (x to stop)" << endl;
    cin >> part2temp;
    part2.push_back(part2temp);
    n++;

    if (cin.fail()||part2temp>99999||part2temp<10000){
        cout << "End condition matched" << endl;
        cin.clear();
        cin.ignore(10);
        noerror=(false);
    }
}
cout << "escaped loop" << part2[n] << endl;

たとえば、xを入力すると、ループのIF部分から画面に出力が表示されますが、何らかの理由でbool値を変更してもループは終了せず、「escapedloop」というテキストが画面に表示されません。

誰かが私が間違っていることを教えてもらえますか?

4

3 に答える 3

3

part2[n]がの境界を 1 つ超えると、未定義の動作が発生しvectorます。これが、次のコード行の出力が表示されない理由である可能性があります。

cout << "escaped loop" << part2[n] << endl;

ループが終了しないという印象を与えます。ループが 1 回だけ実行される場合、 namedにn == 1は 1 つの要素のみが存在します。つまり、 のみが有効です。この使用を確認してブロックにラップするには:vectorpart2part2[0]vector::at()try{}catch(std::out_of_range&)

try
{
    cout << "escaped loop" << part2.at(n) << endl;
}
catch (std::out_of_range const&)
{
    std::cerr << "Access out of range\n";
}

vector修正するには、ではないことを確認し、または のいずれ かempty()を使用します。[n - 1]vector.back()

于 2013-02-18T09:20:38.753 に答える
2

なぜあなたは使用していcin.ignore()ますか?書かれているように、cin.ignore()10文字を読んだ後にのみ戻ります。ユーザーが入力後 (新しい行を入力する前) に 10 文字を入力する必要があることを本当に望んでいますか? 入力が行指向の場合、通常の手順では、 を使用std::getlineして行全体を読み取り、std::istringstream;を使用して解析します。std::cin.ignore( MAX_INT, '\n' );または、次の改行まで無視する のようなものを使用することもできます。

于 2013-02-18T09:37:31.110 に答える
0

変化する

cin.ignore(10);

cin.ignore(10,'\n');

その後、ループが終了します。試してみてください!

于 2013-02-18T09:38:40.690 に答える