为什么这段代码最终会进入无限循环,从std :: cin读取

时间:2015-04-14 16:53:51

标签: c++ loops stdvector

您好我尝试通过矢量为我的函数创建一个输入函数。

但是,我不知道为什么我的输入会变成无限循环?

do {            
    cout << "Please enter the next number: ";
    cin >> num;
    number.push_back(num);
    cout << "Do you want to end? enter 0 to continue.";
    dec = NULL;
    cin >> dec;
} while(dec == 0);

1 个答案:

答案 0 :(得分:1)

  

“我不知道为什么我的输入会变成无限循环。”

我能想象的唯一原因是,任何不正确的输入都会将cin设置为fail状态。在这种情况下(例如输入了无效的数字,或者仅按 ENTER ){} {}}设置为cin状态,fail中的值不会永远改变。一旦dec处于cin状态,任何后续输入操作将分别失败,并且输入的主题将不会更改。

要证明此类行为,您必须fail clear()的状态,并在继续之前阅读安全点(另请参阅:How to test whether stringstream operator>> has parsed a bad type and skip it):< / p>

std::istream

以下是三个具有不同输入的工作演示以结束循环:

1st Input

do {
    cout << "Please enter the next number: ";
    if(cin >> num) {
        number.push_back(num);
    }
    else {
       cerr << "Invalid input, enter a number please." << std::endl;
       std::string dummy;  
       cin.clear();
       cin >> dummy;
    }
    cout << "Do you want to end? enter 0 to continue.";
    dec = -1;
    if(!(cin >> dec)) {
       std::string dummy;  
       cin.clear();
       cin >> dummy;
       break; // Escape from the loop if anything other than 0 was
              // typed in
    }
} while(dec == 0);

输入

2nd Input

1
0
2
0
3
0
4

3rd Input

1
0
2
0
3
0
4
xyz

循环是有限的,以上所有的输出都是

1
0
2
0
3
0
4
42

<子> 您还应该注意我已将1234 更改为bool dec;,但这可能是一个小问题。