2013-02-18 223 views
0

我不明白为什么这个while循环不停止,一旦结束条件匹配?为什么这个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的例子,但由于某些原因改变布尔值不会终止循环和文本输入“逃脱环”从未在屏幕上显示。

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

+0

有几件事:首先,矢量中的索引从[0 ... n]开始,所以'part2 [n]'索引一个超过结尾。第二,你不需要跟踪矢量中元素的数量,“std :: vector”为你做这件事;使用'part2.size()'来获取值。第三,假设vector非空,'part2.back()'是访问最后一个元素的最简单方法。 – 2013-02-18 09:26:56

+0

什么样的最终条件(你有三个)不符合你的期望?他们全部?? – WhozCraig 2013-02-18 09:27:00

+0

另外,您应该检查是否在访问'part2temp'(即'push_back'之前)之前_before_失败。 (你应该在循环中定义'part2tmp',而不是在其外面。) – 2013-02-18 09:28:35

回答

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"; 
} 

要纠正,确认vectorempty(),并请使用[n - 1]vector.back()

+0

我从代码中删除了该部分,因为它不是必需的,谢谢指出它,即时通讯与编程语言混合在一起.. – user2054823 2013-02-18 09:31:01

+0

@ user2054823,我不清楚问题现在是否已解决?顺便说一句,除非在其他地方需要'noerror',否则你可以在'if'和'noerror'变量中''while''中断''而不再需要。 – hmjd 2013-02-18 09:34:26

+0

@hmjd不建议对没有经验的程序员使用'break'。从全球来看,这几乎不是一个好主意。一个更好的解决方案是创建一个用提示读取的函数,然后循环:像'while(getlineWithPrompt(prompt,line))'(其中'getlineWithPrompt'返回'std :: cin')。 – 2013-02-18 09:56:30

2

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

+0

我已经修复了这个问题,结果表明它不喜欢: cin.ignore(10); 并且从来没有真正到过布尔设置为false的行。我不知道为什么这是一个问题,但通过将其更改为: cin.ignore(10,'\ n'); 如果任何人都可以向我解释,我将不胜感激,感谢迄今为止所有的帮助! – user2054823 2013-02-18 09:38:03

+0

+1为实际原因。 – hmjd 2013-02-18 09:45:46

+0

@ user2054823正如我在我的回答中所说的,'cin.ignore(10)'只有在能够读取10个字符(或遇到文件结尾)时才会返回。 'cin.ignore(10,'\ n');'最多可以忽略10个字符;如果用户在号码后输入20个空格,则可能无法获得理想的效果。 – 2013-02-18 09:53:54

0

变化

cin.ignore(10);

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

然后循环退出,试试吧!

+0

哎呀!我迟到了!你已经解决了你的问题! – 2013-02-18 09:40:43