我无法理解为什么这个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值不会终止循环并且文本“转义循环”从不显示在屏幕上。
谁能告诉我我做错了什么?
答案 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');
然后循环退出,试试吧!