Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 5.00
XaosLord
3 / 3 / 1
Регистрация: 18.03.2009
Сообщений: 20
#1

Игнорирует cin в цикле. - C++

21.03.2009, 16:37. Просмотров 4403. Ответов 11
Метки нет (Все метки)

Здравствуйте, уважаемые.

Прошу помочь. Не могу понять почему в приведенном ниже коде при втором и последующем прохождении цмкла команда cin игнорируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int uzl = 0;
    bool bzz = 0;
    do  {
        cout << _r("Введите колличество и нажмите <Enter>") << endl;
        cout << ">> ";
        cin >> uzl;
        if ((uzl <= 0) || (uzl > 255))
        {
            cout << _r("Что-то не так... Введите, пожалуйста, целое положительное число не более 255");
            bzz = false;
        }
        else
        {
            bzz = true;
        }
    } while (bzz == false);
Заранее благодарен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
21.03.2009, 16:49     Игнорирует cin в цикле. #2
Кто такой _r? Если выводить сообщение без него, то лично у меня все работает.
XaosLord
3 / 3 / 1
Регистрация: 18.03.2009
Сообщений: 20
21.03.2009, 17:03  [ТС]     Игнорирует cin в цикле. #3
это "русификатор", чтоб в консоли кирилица норм показывалась.

Убрал её - один хвост.

Собираю VS2008E... может в ней проблема?

Добавлено через 1 минуту 29 секунд
Цитата Сообщение от Nestor Посмотреть сообщение
Кто такой _r? Если выводить сообщение без него, то лично у меня все работает.
Точно работает? При невыполнении условия завершения цикла все нормально второй раз спрашивает?
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
21.03.2009, 17:10     Игнорирует cin в цикле. #4
Собрал в VS2008, тоже все нормально. Может как-нибудь не так проверяешь? Например, ввожу 0 (bzz - false), цикл идет еще раз, ввожу 1 (bzz - true), cin все считывает и цикл завершается.
XaosLord
3 / 3 / 1
Регистрация: 18.03.2009
Сообщений: 20
21.03.2009, 17:14  [ТС]     Игнорирует cin в цикле. #5
Попробовал в Dev-C++. Тоже самое...

Все, понял... Глюк только если вводить символы... Что можно сделать?
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
21.03.2009, 17:32     Игнорирует cin в цикле. #6
Поставь проверку, чтобы вводились только цифры. Функция isdigit.
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.03.2009, 17:55     Игнорирует cin в цикле. #7
Я уже объяснял на форуме почему так работает.
Когда ты вводишь что-нибудь в консоли (число). То ты жмешь Enter чтобы ввести. Enter добавляет символ перехода на новую строку в буфер ввода - \n. cin читает число. Ему переход на фиг не нужен, поэтому символ \n остается в буфере.
В следующий раз, когда ты заставляешь cin считывать что, он смотрит в буфер, а там еще \n остался. Он его считывает, что правильно. И это значит, что ты ввел \n (энтер нажал). И дальше прет по программе.
Теперь понятно почему это так работает?
Feldor
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 22
21.03.2009, 17:58     Игнорирует cin в цикле. #8
очистку буфера клавы делать нужно и всё
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.03.2009, 18:03     Игнорирует cin в цикле. #9
Цитата Сообщение от Feldor Посмотреть сообщение
очистку буфера клавы делать нужно и всё
Именно так.
Также можно cin.get()'ом один символ оттуда убирать. Студенческий метод

P. S. я надуюсь, что из объяснения причины люди поймут, наконец, что среда и компилер тут не при чем. И как с этим справиться.
Feldor
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 22
21.03.2009, 18:58     Игнорирует cin в цикле. #10
Цитата Сообщение от Vourhey Посмотреть сообщение
Именно так.
Также можно cin.get()'ом один символ оттуда убирать. Студенческий метод
полностью с вами согласен, товарищ Гуру))
XaosLord
3 / 3 / 1
Регистрация: 18.03.2009
Сообщений: 20
21.03.2009, 23:15  [ТС]     Игнорирует cin в цикле. #11
Цитата Сообщение от Vourhey Посмотреть сообщение
Я уже объяснял на форуме почему так работает.
Когда ты вводишь что-нибудь в консоли (число). То ты жмешь Enter чтобы ввести. Enter добавляет символ перехода на новую строку в буфер ввода - \n. cin читает число. Ему переход на фиг не нужен, поэтому символ \n остается в буфере.
В следующий раз, когда ты заставляешь cin считывать что, он смотрит в буфер, а там еще \n остался. Он его считывает, что правильно. И это значит, что ты ввел \n (энтер нажал). И дальше прет по программе.
Теперь понятно почему это так работает?
Все очень красиво написано. Теперь мой другой вопрос отпал. Но вопрос, задающийся в этой теме остался. Ибо цикл, который я предложил, при скармливании cin'у символа, а не числа, впадает в бесконечность. По вашему обяснению он должен игнорить cin все-таки ограниченное количество раз.
Если не затруднит, поясните, что это может быть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2009, 02:58     Игнорирует cin в цикле.
Еще ссылки по теме:

Компилятор игнорирует функции cin, if, for C++
Игнорирует ввод cin C++
Объяснить поведение объекта std::cin в цикле while C++
C++ Выяснить почему после ввода первого элемента массива цикл не работает (std::cin в цикле for)
C++ Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
22.03.2009, 02:58     Игнорирует cin в цикле. #12
По вашему обяснению он должен игнорить cin все-таки ограниченное количество раз.
По моему объяснению, ты должен сам сидеть, копаться, дизассемблировать, читать, чтобы добраться до истины. А в твоем случае, ее и копать-то не надо...
Если говорить по сути, то cin после ввода строки вообще не выполняется. Он выполняется один раз. А точнее читает поток ввода один раз. Видит, что ты напортачил с вводимыми данными и потом он уже не читает ничего из потока. То есть функция чтения даже не вызывается в иерархии оператора >>. А не вызывается она потому что установлен бит ошибки у потока.

Если бы ты сам захотел понять, что происходит, то дошел бы до того, что в случае со строкой программа меняет свое выполнение в конструкторе std::istream::sentry::sentry. После этого покопавшись в заголовочном файле istream ты бы наткнулся на:
* All the @c operator>> functions (aka <em>formatted input
* functions</em>) have some common behavior. Each starts by
* constructing a temporary object of type std::basic_istream::sentry
* with the second argument (noskipws) set to false. This has several
* effects, concluding with the setting of a status flag; see the
* sentry documentation for more.
*
* If the sentry status is good, the function tries to extract
* whatever data is appropriate for the type of the argument.
*
* If an exception is thrown during extraction, ios_base::badbit
* will be turned on in the stream's error state without causing an
* ios_base::failure to be thrown. The original exception will then
* be rethrown.
А потом бы, конечно, додумался проверить биты ошибок. И ты, конечно, полез бы куда-нибудь в инет, чтобы почитать про это больше... Например сюда:
http://library.forum.nokia.com/index...eam_chap3.html

Теперь мое объяснение более доступно для понимания? Если нет - то пофиг. Захочешь - разберешься. gdb в руки и вперед...
Yandex
Объявления
22.03.2009, 02:58     Игнорирует cin в цикле.
Ответ Создать тему
Опции темы

Текущее время: 15:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru