为什么这段代码会陷入无限循环,从 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
状态。在这种情况下(例如,输入了无效数字,或者只是按下了 ENTER)cin
设置为 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);
这是三个工作演示,使用不同的输入来结束循环:
1
0
2
0
3
0
4
输入
1
0
2
0
3
0
4
xyz
1
0
2
0
3
0
4
42
循环是有限的,以上所有的输出都是
1234
您还应该注意到,我已将 bool dec;
更改为 int dec;
,但这可能是一个小问题。
您好,我尝试通过向量为我的函数创建一个输入函数。
但是,我不知道为什么我的输入会变成死循环?
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
状态。在这种情况下(例如,输入了无效数字,或者只是按下了 ENTER)cin
设置为 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);
这是三个工作演示,使用不同的输入来结束循环:
1
0
2
0
3
0
4
输入
1
0
2
0
3
0
4
xyz
1
0
2
0
3
0
4
42
循环是有限的,以上所有的输出都是
1234
您还应该注意到,我已将 bool dec;
更改为 int dec;
,但这可能是一个小问题。