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 值不会终止循环,并且文本“转义循环”永远不会显示在屏幕上。

谁能告诉我我做错了什么?

4

3 回答 3

3

存在未定义的行为,因为part2[n]超出了 的范围,这vector可能是以下代码行的输出从未出现的原因:

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

给人的印象是循环没有退出。如果循环只执行一次,那么n == 1vectornamed中只有一个元素part2,这意味着 onlypart2[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";
}

要更正,请确认vectoris notempty()并使用[n - 1] or 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 回答