"Я не знаю, почему мой вход стал бесконечным циклом."
Единственная причина, я могу себе представить, что любой неправильный вход устанавливает cin
в fail
состояние. В этом случае (например, введен неверный номер или просто нажата ENTER) cin
установлено в состояние fail
, и ваша стоимость в dec
больше не изменится. Как только cin
находится в fail
, состояние любых последующих операций ввода не будет выполнено соответственно, и объект для ввода не будет изменен.
Для доказательства против такого поведения, вы должны clear()
оговаривает его std::istream
«s и читать до безопасной точки, прежде чем продолжить (см также: 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
ENTER
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;
, но это, вероятно, незначительный пункт.
Если dec не является указателем, тогда вы не должны использовать 'dec = NULL;'. Если вы не можете заменить 'NULL' на' nullptr', ваш код должен считаться сломанным. – NathanOliver
Вы должны [добавить некоторые конкретные входы] (http://stackoverflow.com/posts/29633122/edit), заданные с вашим вопросом, когда ваш код показывает это поведение. –
Чтобы дать больше объяснений, почему я вернул ваш вопрос в исходное состояние, следуйте приведенному ниже обсуждению на [Meta SO] (http://meta.stackoverflow.com/questions/290240/should-i-rollback-the -ops-редактирует-если-они-просто-повторностей-мои-ответы предложил-кан). –