Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2017, 17:56   #1
NDrago
Пользователь
 
Регистрация: 22.09.2017
Сообщений: 45
По умолчанию cin.good в цикле while

В общем то ли я дурак,то ли лижи не едут, есть цикл do while который должен проверять ввел ли человек число и если обнаруживает что-то другое повторять запрос ввода,до тех пор пока не получит число, но он почему-то зацикливается бесконечно если получает что-то помимо числа
int x;
do{
cout<<"Введите число"<<endl;
cin>>x;
}while(!cin.good());

вот в чем проблема? возможно я неправильно понимаю как работает cin.good(), по идее он смотрит что ты ввел и если ты ввел тип отличный от запрашиваемого то выдает false если типы совпадают то true
NDrago вне форума Ответить с цитированием
Старый 12.10.2017, 18:08   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Returns true if none of the stream's error state flags (eofbit, failbit and badbit) is set.
Смотрите, какие биты ставит оператор >>. Лень искать.

Скорее всего, нада в начале цикла (после do сразу) добавить сброс битов ошибки.

Код:
int x;
do{
cout<<"Введите число"<<endl;
cin.clear();
cin>>x;
}while(!cin.good());

Последний раз редактировалось alexzk; 12.10.2017 в 18:15.
alexzk вне форума Ответить с цитированием
Старый 12.10.2017, 19:51   #3
NDrago
Пользователь
 
Регистрация: 22.09.2017
Сообщений: 45
По умолчанию

bool test=true;
do {
cout << "Введите число:" << endl;
cin>>op1;
if ( !(test=cin.good()) )
cout << "Вы ввели не число!" << endl;
cin.clear() ;
cin.ignore(numeric_limits<streamsiz e>::max(),'\n') ;
} while(!test);

Да уже разобрался,вот такую фигню наворатил,оставлю тут,может кому поможет
NDrago вне форума Ответить с цитированием
Старый 12.10.2017, 19:55   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от NDrago Посмотреть сообщение
вот в чем проблема?
Известные грабли. Дело в том, что если в потоке нет цифр, то целый ввод не убирает из потока ничего. В результате Вы бесконечно читаете один и тот же символ. После clear нужно этот лишний символ пропустить, например,
Код:
cin.ignore(1);
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск