Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
cin.clear() не работает
|
|||
|---|---|---|---|
|
#18+
Всем привет! Есть такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Специально "ломаю" cin вводом текста "фыва" вместо числа. Как и ожидаю, cin ломается, что приводит к тому, что он больше не запрашивает ввод. Я хочу его починить с помощью cin.clear(), но не получается. Подскажите, пожалуйста, в чем может быть проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 23:15 |
|
||
|
cin.clear() не работает
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Когда оператор >> не смог прочесть буквы в качестве числа, он их оставил в буфере. clear всего лишь очищает флаг ошибки, а введенная ошибочно строка остается в буфере. Вам надо ее оттуда прочитать. Для этого объявите переменную std::string и прочтите в нее остаток строки через getline(cin, tmpstr); Если не хотите переменную объявлять то у cin есть еще метод ignore() которым можно удалить из буфера символы до перевода строки: cin.ignore(100000, '\n'). 100000 = сколько символов максимально удалять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 23:30 |
|
||
|
cin.clear() не работает
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Ну а цикл у вас конечно неверный. Зачем вы проверяете на ошибку ДО чтения из потока? Если там ошибка уже была, то это не связанная ошибка, и восстановление после нее скорее всего совершенно по-другому делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 23:33 |
|
||
|
cin.clear() не работает
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Спасибо большое! Действительно, после cin.ignore() работает гуд :). Anatoly MoskovskyДля этого объявите переменную std::string и прочтите в нее остаток строки через getline(cin, tmpstr); Я еще не учил как объявлять переменные таким образом [std::string]... Я могу просто объявить "char tmpstr[50]" и передать ее в функцию getline? Anatoly MoskovskyЗачем вы проверяете на ошибку ДО чтения из потока? А как Вы предлагаете написать цикл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 23:47 |
|
||
|
cin.clear() не работает
|
|||
|---|---|---|---|
|
#18+
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. Anatoly MoskovskyЗачем вы проверяете на ошибку ДО чтения из потока? А как Вы предлагаете написать цикл? Сделайте цикл бесконечным, а проверку делайте ПОСЛЕ чтения из cin. В случае если ошибки нет - выходите из цикла через break. Только, если вы какие-то лабы делаете,то учтите что некоторые преподы не любят выходы из цикла через break ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 00:03 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38029483&tid=2020700]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
200ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 19ms |
| total: | 323ms |

| 0 / 0 |
