Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 12

Как ведет себя cin, если пользователь вводит некорректные данные?

09.12.2012, 02:39. Показов 1125. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читаю C++ Primer Plus by Stephen Prata. В седьмой главе у него есть следующий пример.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// lotto.cpp -- probability of winning
#include <iostream>
// Note: some implementations require double instead of long double
long double probability(unsigned numbers, unsigned picks);
int main()
{
    using namespace std;
    double total, choices;
    cout << "Enter the total number of choices on the game card and\n"
            "the number of picks allowed:\n";
    while ((cin >> total >> choices) && choices <= total)
    {
        cout << "You have one chance in ";
        cout << probability(total, choices);      // compute the odds
        cout << " of winning.\n";
        cout << "Next two numbers (q to quit): ";
    }
    cout << "bye\n";
    // cin.get();
    // cin.get();
    return 0;
}
 
// the following function calculates the probability of picking picks
// numbers correctly from numbers choices
long double probability(unsigned numbers, unsigned picks)
{
    long double result = 1.0;  // here come some local variables
    long double n;
    unsigned p;
 
    for (n = numbers, p = picks; p > 0; n--, p--)
        result = result * n / p ; 
    return result;
}
Условием выхода из программы есть введение символа 'q' на запрос.

С другой стороны, в тексте программы я нигде не вижу явной проверки на равенство какой-либо переменной или результата вызова какой-либо функции на равенство этому самому 'q' (проверяется только choices <= total).

Далее, если откомпилировать исходик и запустить программу, то становится ясно, что программа выходит, если вы вводите не цифры. Создав простенький пример, в котором пользователю предлагается ввести значение типа int, а он вводит какую-нибудь белиберду, и после этой самой белиберды вывести значение переменной, то оно будет равным нулю.

Собственно, после этих многабукаф(тм) сам вопрос: расскажите (или ткните, где можно прочитать) поподробнее про поведение всех этих объектов и методов класса iostream? То есть, какие сведения о них могут гарантировать, что вышеприведенная программа будет работать именно таким образом? Прата после разбора исходного текста (по крайней мере, в этом месте) об этом не упоминает...

Thanks in advance, как говорится... =)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.12.2012, 02:39
Ответы с готовыми решениями:

cin странно себя ведет
Здравствуйте! Если в самом начале в майне написать char tch; cin.getline(tch,32) То все Ок, работает как надо. Но в в мэйне...

Рейд, Если Сыпится, Как Ведёт Себя Сервер?
Представьте себе ситуацию, имеет рейд, и во время работы один из дисков отваливается. Домино начинает чекать базы плюясь и ругаясь на...

Как обработать ситуацию, если пользователь вводит не нужный пункт меню?
Вот мой код: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace...

2
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.12.2012, 02:43
std::cin - объект, тип которого наследуюется от std::istream

http://www.cplusplus.com/refer... m/istream/
Member functions inherited from ios
good
Check if the state of the stream is good for i/o operations. (public member function)
eof
Check if eofbit is set (public member function)
fail
Check if either failbit or badbit is set (public member function)
bad
Check if badbit is set (public member function)
там же где-то могут быть еще функции для проверок и сброса.
в общем стрим становится бэдным и по хорошему после каждого ввода его нужно проверять на то, не попортился ли он.
1
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 12
09.12.2012, 03:04  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
std::cin - объект, тип которого наследуюется от std::istream

http://www.cplusplus.com/refer... m/istream/

там же где-то могут быть еще функции для проверок и сброса.
в общем стрим становится бэдным и по хорошему после каждого ввода его нужно проверять на то, не попортился ли он.
Ага-ага, открыл ссыль, надо почитать, там много всего понаписано. То есть, я могу сделать вывод, что автор, чтобы не пугать начинающих и не углубляться в дебри, просто все эти проверки на дуракоустойчивость пропустил, и пример стал несколько неочевидным? =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2012, 03:04
Помогаю со студенческими работами здесь

Cin>>float вводит не совсем точные данные
cin&gt;&gt;float ввожу допустим 3339.08, а присваивается значение 3339.08008. Из-за чего происходит это? Можно ли как-то сделать так, чтоб...

Как сохранить данные в cookies,которые вводит пользователь через prompt?
Привет,возникли трудности с одним заданием,только изучаю js.Как сохранить данные в cookies,которые вводит пользователь через prompt?

Как обработать исключение, если пользователь вводит вместо цифр буквы или другие символы?
Всем привет. Кто может подсказать как обработать исключение, если пользователь вводит вместо цифр буквы или другие символы? Код: ...

Пользователь вводит путь к папке и маску файлов. Также пользователь вводит имя результирующего файла
Пользователь вводит путь к папке и маску файлов. Также пользователь вводит имя результирующего файла. Программа пишет в результирующий...

Пользователь вводит текущее время в формате: часы:минута и если 0:00 - 5:59 программа пишет Night, если 6:00-11:59 morning
Помогите написать код для этой задачи(на С++): Пользователь вводит текущее время в формате: часы:минута и если 0:00 - 5:59 программа...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru