Usama Iftikhar Butt Ответов: 1

A ожидаемое поведение C/C++


Черт бы побрал всех до единого...
У меня есть C/C++ программа. И когда я запускаю этот код, поведение программы очень странно.

Что я уже пробовал:

#include "stdafx.h"
#include "iostream"
using namespace std;

int main() {
	int n;

	do {
		cout << "Enter a number   = ";
		cin >> n;
	} while (n != 2);
}



Скомпилируйте этот код и введите целочисленное значение, кроме 2 код работает хорошо.
Теперь введите характер или плыть (не целое число) число и увидеть странное поведение.
Независимо от того, используете ли вы цикл for, while или do-while, поведение будет одинаковым.
Я попробовал этот код в visual studio 2012, 2013, 2015 и турбо Си 3.1 версии. Поведение то же самое.

Так что может ли кто - нибудь помочь мне решить эту проблему.

[no name]

На техническом форуме вы должны рассказать нам о поведении, которое вы ожидаете и наблюдаете. Это не соревнование в угадывании. Так в чем же именно заключается проблема? Вы объявили n int, поэтому введите float, и результат, конечно же, будет непредсказуемым. Google все это объяснит.

Richard MacCutchan

Ваша программа запрашивает номер, поэтому она должна проверить, что был введен только номер. Программирование-это не только написание логики, но и проверка входных данных, предоставляемых пользователями.

1 Ответов

Рейтинг:
9

Peter_in_2780

Короткий ответ заключается в том, что при обнаружении недопустимого ввода, cin (который является istream) устанавливает свой бит состояния сбоя, заставляя дальнейший ввод игнорироваться до тех пор, пока Ошибка потока не будет очищена. В этом нет ничего неожиданного на всех. Это было частью стандартного поведения с незапамятных времен.


[no name]

Он терпит неудачу, что, конечно, предсказуемо, но в этом случае каково значение n?

Jochen Arndt

Видишь ли https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt:

Если извлечение не удается (например, если буква была введена там, где ожидается цифра), значение остается неизмененным и устанавливается failbit. (до C++11)

Если извлечение не удается, ноль записывается в значение и устанавливается failbit. Если извлечение результатов в значение слишком большим или слишком маленьким, чтобы вписаться в значение, функции std::numeric_limits в<Т>::Макс() или std::numeric_limits в<Т>::min() является письменной и failbit устанавливается флаг. (начиная с C++11)

Peter_in_2780

Спасибо! Я знал о failbit, но я не знал о возврате нуля с C++11. Хотите сделать это решением проблемы? (тогда я могу поднять его :p )

Jochen Arndt

Спасибо. Но я не думаю, что нужно вкладывать это в решение. Вы уже описали, что происходит. В таких случаях само значение ошибки не имеет большого значения (кроме того, оно может быть использовано для обнаружения выходящих за пределы диапазона входных данных с помощью C++11).