powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / cin.clear() не работает
6 сообщений из 6, страница 1 из 1
cin.clear() не работает
    #38029452
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Есть такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	int b=0;
	do
	{
		if (std::cin.fail())
		{
			cin.clear();
			cout <<"Повторите ввод\n";
		}
		cin>>b;
	} while (std::cin.fail());


Специально "ломаю" cin вводом текста "фыва" вместо числа. Как и ожидаю, cin ломается, что приводит к тому, что он больше не запрашивает ввод.
Я хочу его починить с помощью cin.clear(), но не получается.
Подскажите, пожалуйста, в чем может быть проблема?
...
Рейтинг: 0 / 0
cin.clear() не работает
    #38029460
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G,

Когда оператор >> не смог прочесть буквы в качестве числа, он их оставил в буфере.
clear всего лишь очищает флаг ошибки, а введенная ошибочно строка остается в буфере.
Вам надо ее оттуда прочитать. Для этого объявите переменную std::string и прочтите в нее остаток строки через getline(cin, tmpstr);
Если не хотите переменную объявлять то у cin есть еще метод ignore() которым можно удалить из буфера символы до перевода строки: cin.ignore(100000, '\n'). 100000 = сколько символов максимально удалять.
...
Рейтинг: 0 / 0
cin.clear() не работает
    #38029462
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G,

Ну а цикл у вас конечно неверный.
Зачем вы проверяете на ошибку ДО чтения из потока?
Если там ошибка уже была, то это не связанная ошибка, и восстановление после нее скорее всего совершенно по-другому делается.
...
Рейтинг: 0 / 0
cin.clear() не работает
    #38029470
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Спасибо большое! Действительно, после cin.ignore() работает гуд :).
Anatoly MoskovskyДля этого объявите переменную std::string и прочтите в нее остаток строки через getline(cin, tmpstr);
Я еще не учил как объявлять переменные таким образом [std::string]...
Я могу просто объявить "char tmpstr[50]" и передать ее в функцию getline?
Anatoly MoskovskyЗачем вы проверяете на ошибку ДО чтения из потока?
А как Вы предлагаете написать цикл?
...
Рейтинг: 0 / 0
cin.clear() не работает
    #38029481
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G Anatoly Moskovsky
Спасибо большое! Действительно, после cin.ignore() работает гуд :).
Anatoly MoskovskyДля этого объявите переменную std::string и прочтите в нее остаток строки через getline(cin, tmpstr);
Я еще не учил как объявлять переменные таким образом [std::string]...
Я могу просто объявить "char tmpstr[50]" и передать ее в функцию getline?

Не. char tmpstr[50] - бессмысленно. Лучше через ignore(), так хотя бы переполнения буфера не будет при вводе больше размера массива.

А с std::string так:
Код: plaintext
1.
2.
std::string tmp;  // для std::string надо включить #include <string>
getline(cin, tmp);



Anatoly MoskovskyЗачем вы проверяете на ошибку ДО чтения из потока?
А как Вы предлагаете написать цикл?
Сделайте цикл бесконечным, а проверку делайте ПОСЛЕ чтения из cin. В случае если ошибки нет - выходите из цикла через break.

Только, если вы какие-то лабы делаете,то учтите что некоторые преподы не любят выходы из цикла через break
...
Рейтинг: 0 / 0
cin.clear() не работает
    #38029483
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, спасибо большое! Удачи! :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / cin.clear() не работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]