2015-04-14 1 views
1

Привет, я пытаюсь создать функцию ввода для моей функции через вектор.Почему этот код заканчивается в бесконечном цикле, чтение из 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); 
+1

Если dec не является указателем, тогда вы не должны использовать 'dec = NULL;'. Если вы не можете заменить 'NULL' на' nullptr', ваш код должен считаться сломанным. – NathanOliver

+1

Вы должны [добавить некоторые конкретные входы] (http://stackoverflow.com/posts/29633122/edit), заданные с вашим вопросом, когда ваш код показывает это поведение. –

+0

Чтобы дать больше объяснений, почему я вернул ваш вопрос в исходное состояние, следуйте приведенному ниже обсуждению на [Meta SO] (http://meta.stackoverflow.com/questions/290240/should-i-rollback-the -ops-редактирует-если-они-просто-повторностей-мои-ответы предложил-кан). –

ответ

1

"Я не знаю, почему мой вход стал бесконечным циклом."

Единственная причина, я могу себе представить, что любой неправильный вход устанавливает 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;, но это, вероятно, незначительный пункт.

+0

, но он не перейдет к следующей строке кода :( –

+1

@HuangElizabeth _ «следующая строка кода» _ Я не понимаю, что вы имеете в виду? –

+0

Существует цикл для вывода после моей функции while. Если я нажму 0 для завершения программы. Программа не перейдет к следующему циклу вывода. Я редактирую свой пост. –