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

Защита от дурака. Ввод данных типа int с клавиатуры. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.85
grumpy13
1 / 1 / 0
Регистрация: 12.04.2012
Сообщений: 20
14.04.2012, 02:11     Защита от дурака. Ввод данных типа int с клавиатуры. #1
Данные типа int вводятся с клавиатуры. нужно поставить защиту от дурака. Полазил на форуме нашёл программу:

Цитата Сообщение от usernet009 Посмотреть сообщение
ТС, у потока cin есть failbit. Этот фэилбит становится еденичкой если пользователь ввел что то не так, ну например
cin>>i; // i - int
А пользователь вводит 2.2
в переменную i попадает 2 а failbit становится = 1
И, если ты попробуешь дальше ввести чтото, например
cin>>f; //f - float
то ничего не введется так как failbit уже установлен а ввод может происходить только из "хорошего" потока.
В общем. К чему я все это, попробуй вот так
C++
1
2
3
4
5
6
7
cin>>i;
while(cin.fail() == 1) // cin.fail() возвращает 1 если установлет failbit
{
cout<<"IDIOT !! Enter again !\n";
cin.clear(); // сбрасывает все биты потока, тоесть поток становится "хорошим"
cin>>i;
}
p.s сам только недавно прочитал про эти биты\потоки, так что сильно не пинай если на заработает
по аналогии пытался сделать свою:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <conio.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    int i;
 cin>>i;
while (cin.fail() == 1) // cin.fail() возвращает 1 если установлет failbit
{
cout<<"IDIOT !! Enter again !\n";
cin.clear(); // сбрасывает все биты потока, тоесть поток становится "хорошим"
cin>>i;
}
cout << i;
 getch();
 return 0;
}
но когда в поток вводится, например "gt57" программа зависает в бесконечном цикле, выводя беспрерывно строчки "IDIOT !! Enter again !".

подскажите пожалуйста, где ошибка в цикле?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
14.04.2012, 02:23     Защита от дурака. Ввод данных типа int с клавиатуры. #2
grumpy13, всё на много проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main()
{
    int i;
    cout<<"Enter int : ";
    while(!(cin>>i)) 
    {
        cout<<"IDIOT !! Enter again !\n";
        cin.clear(); // сбрасывает все биты потока, тоесть поток становится "хорошим"
        cin.sync();//Удалим данные из буффера
        cout<<"Enter int : ";
    }
    system("pause");
    return 0;
}
Миниатюры
Защита от дурака. Ввод данных типа int с клавиатуры.  
grumpy13
1 / 1 / 0
Регистрация: 12.04.2012
Сообщений: 20
14.04.2012, 02:26  [ТС]     Защита от дурака. Ввод данных типа int с клавиатуры. #3
спасибо большое)

нашёл и у себя ошибку. не хватало строки: cin.sync();

с ней мой вариант так же работает.
-=ЮрА=-
Заблокирован
Автор FAQ
14.04.2012, 02:28     Защита от дурака. Ввод данных типа int с клавиатуры. #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну а вообще посмотри этот пост (тебе код С++)
http://www.cyberforum.ru/blogs/34326...ml#comment1451
можешь и блог в целом почитать(только тогда уже весь)
В идеале код должен выглядеть так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main()
{
    int i;
    cout<<"Enter int : ";
    while(!(cin>>i) || cin.get() != '\n') 
    {
        cout<<"IDIOT !! Enter again !\n";
        cin.clear(); // сбрасывает все биты потока, тоесть поток становится "хорошим"
        cin.sync();//Удалим данные из буффера
        cout<<"Enter int : ";
    }
    system("pause");
    return 0;
}
Почему так
C++
1
while(!(cin>>i) || cin.get() != '\n')
а не как сверху
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(!(cin>>i))
- попробуй ввести в верхнем кода 1а или 12blabla и увидишь что целое будет подхвачено хотя по хорошему ввод неверен
Миниатюры
Защита от дурака. Ввод данных типа int с клавиатуры.  
-=ЮрА=-
Заблокирован
Автор FAQ
14.04.2012, 02:31     Защита от дурака. Ввод данных типа int с клавиатуры. #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Основная фишка - неверный ввод фиксируется вот так
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(cin>>i))
, для всевозможных дополнительных вариантов неверного ввода необходимо его оснастить ещё cin.get, т.е. идеальній или близкий к нему вариант фиксации вот этот
C++
1
if(!(cin>>i) || cin.get() != '\n')
. И ещё один момент, после кривого ввода обязательно вытерать буффер
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.sync();//Удалим данные из буффера
, а не только сбрасывать флаг ошибки
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.clear();
. Невытертый буффер будет продолжать коробить наш ввод. Вот теперь пожалуй и всё по данному топику
grumpy13
1 / 1 / 0
Регистрация: 12.04.2012
Сообщений: 20
14.04.2012, 02:34  [ТС]     Защита от дурака. Ввод данных типа int с клавиатуры. #6
Огромное вам спасибо !
-=ЮрА=-
Заблокирован
Автор FAQ
28.04.2013, 17:57     Защита от дурака. Ввод данных типа int с клавиатуры. #7
"По просьбам трудящихся" ниже проект с безопасным вводом и меню на заданное кол-во цифровых значений
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
36
37
38
39
40
41
#include <iostream>
using namespace std;
 
int main()
{
    int iChoise= 0;//переменная отвечающая за ввод пользователя
    bool bWork = true;//флаг продолжения работы алгоритма
    while( bWork )
    {
        cout<<"\tMENU"<<endl;
        cout<<"1 - Item1"<<endl;
        cout<<"2 - Item2"<<endl;
        cout<<"0 - Exit"<<endl;
        cout<<"Your choise : ";
        if(!(cin>>iChoise) || cin.get() != '\n') 
        {
            cout<<"Incorrect input!"<<endl;
            cin.clear(); // сбрасывает все биты потока, тоесть поток становится "хорошим"
            cin.sync();//Удалим данные из буффера
        }
        else
        {
            switch(iChoise)
            {
            case 1:
                cout<<"Run Item1"<<endl;
                break;
            case 2:
                cout<<"Run Item2"<<endl;
                break;
            case 0:
                bWork = false;
                break;
            default:
                cout<<"Unsupperted choise"<<endl;
                break;
            }
        }
    }
    return 0;
}
Миниатюры
Защита от дурака. Ввод данных типа int с клавиатуры.  
p0iznp0izn
Сообщений: n/a
28.04.2013, 18:13     Защита от дурака. Ввод данных типа int с клавиатуры. #8
Трудящиеся говорят Спасибо!
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
02.03.2014, 21:49     Защита от дурака. Ввод данных типа int с клавиатуры. #9
Обьясните, пожалуйста, эту строчку
C++
1
while(!(cin>>i) || cin.get() != '\n')
Добавлено через 6 минут
Пока переменная і не целая или введенный символ не Enter, то выполнить...
Так чтоле?
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,546
02.03.2014, 23:11     Защита от дурака. Ввод данных типа int с клавиатуры. #10
Цитата Сообщение от Donville Посмотреть сообщение
Обьясните, пожалуйста, эту строчку
C++
1
while(!(cin>>i) || cin.get() != '\n')
Условие !(cin>>i) || cin.get() != '\n' означает: либо ошибка ввода, либо в потоке ввода после чтения i остались ещё символы - не сразу конец строки.

Пример 1. Пользователь нажимает клавиши: qwer Enter ( Enter - то есть клавишу Enter )
В этом случае будет выполнено условие !(cin>>i), т.к. из строки "qwer" нельзя прочитать целое число - ошибка ввода.

Пример 2. Пользователь нажимает: 123RT и затем Enter
В этом случае ошибки ввода нет, значение i : 123. Однако в строке ввода ещё остались символы 'R' 'T' и '\n'. В этом случае cin.get() == 'R' ( и значит !='\n' ).

Пример 3. Пользователь вводит: 5111222333 Enter
Здесь ошибка ввода, если sizeof(i) == 4, ошибка диапазона.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 23:40     Защита от дурака. Ввод данных типа int с клавиатуры.
Еще ссылки по теме:

C++ Защита от дурака
C++ Защита от дурака
C++ Защита от дурака

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

Или воспользуйтесь поиском по форуму:
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
02.03.2014, 23:40     Защита от дурака. Ввод данных типа int с клавиатуры. #11
Спасибо большое!
Yandex
Объявления
02.03.2014, 23:40     Защита от дурака. Ввод данных типа int с клавиатуры.
Ответ Создать тему
Опции темы

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