为什么这个while循环不会停止?

时间:2013-02-18 09:15:02

标签: c++

我无法理解为什么这个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值不会终止循环并且文本“转义循环”从不显示在屏幕上。

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

3 个答案:

答案 0 :(得分:3)

由于part2[n]超出了vector的范围,因此存在未定义的行为,并且可能是以下代码行的输出永远不会出现的原因:

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

给人的印象是循环不会退出。如果循环仅执行一次n == 1,则vector中只有一个元素名为part2,这意味着只有part2[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()

答案 1 :(得分:2)

您为什么使用cin.ignore()?如上所述,cin.ignore()只有在读完10个字符后才会返回。你真的希望用户在输入后输入10个字符(在他输入新行之前)吗?如果您的输入是面向行的,通常的过程是使用std::getline读取整行,然后使用std::istringstream解析它;或者,您可以使用类似std::cin.ignore( MAX_INT, '\n' );的内容,这将忽略下一个新行。

答案 2 :(得分:0)

更改

  

cin.ignore(10);

  

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

然后循环退出,试试吧!