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

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

Восстановить пароль Регистрация
 
Zzaponka
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 12
09.12.2012, 02:39     Как ведет себя cin, если пользователь вводит некорректные данные? #1
Читаю 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, как говорится... =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2012, 02:39     Как ведет себя cin, если пользователь вводит некорректные данные?
Посмотрите здесь:

C++ cin странно себя ведет
C++ Програма неадекватно себя ведет
C++ Как ведет себя вектор при добавлении новых элементов пушбеком?
C++ Файловая система C++ некорректно себя ведет
пользователь вводит 3 произвольных числа. нужно проверить, составляют ли они геометрическую прогрессию и, если составляют, вывести на экран первые 10 C++
C++ Работаю с файлом *.txt. Прога ведет себя странно если последняя строка файла пуста. Почему так?
C++ Пользователь вводит текущее время в формате: часы:минута и если 0:00 - 5:59 программа пишет Night, если 6:00-11:59 morning
класс string. Программа странно себя ведет C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.12.2012, 02:43     Как ведет себя cin, если пользователь вводит некорректные данные? #2
std::cin - объект, тип которого наследуюется от std::istream

http://www.cplusplus.com/reference/istream/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)
там же где-то могут быть еще функции для проверок и сброса.
в общем стрим становится бэдным и по хорошему после каждого ввода его нужно проверять на то, не попортился ли он.
Zzaponka
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 12
09.12.2012, 03:04  [ТС]     Как ведет себя cin, если пользователь вводит некорректные данные? #3
Цитата Сообщение от DU Посмотреть сообщение
std::cin - объект, тип которого наследуюется от std::istream

http://www.cplusplus.com/reference/istream/istream/

там же где-то могут быть еще функции для проверок и сброса.
в общем стрим становится бэдным и по хорошему после каждого ввода его нужно проверять на то, не попортился ли он.
Ага-ага, открыл ссыль, надо почитать, там много всего понаписано. То есть, я могу сделать вывод, что автор, чтобы не пугать начинающих и не углубляться в дебри, просто все эти проверки на дуракоустойчивость пропустил, и пример стал несколько неочевидным? =)
Yandex
Объявления
09.12.2012, 03:04     Как ведет себя cin, если пользователь вводит некорректные данные?
Ответ Создать тему
Опции темы

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