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

Why does this code end up in an infinite loop, reading from std::cin

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

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

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);

"I don't know why my input become infinite loop."

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

为了防止这种行为,您必须 clear() std::istream 的状态,并在继续之前阅读到安全点(另请参阅:How to test whether stringstream operator>> has parsed a bad type and skip it) :

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);

这是三个工作演示,使用不同的输入来结束循环:

1st Input:

1
0
2
0
3
0
4

输入

2nd Input:

1
0
2
0
3
0
4
xyz

3rd Input

1
0
2
0
3
0
4
42

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

1234

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