Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.96
almostclever
1 / 1 / 1
Регистрация: 04.03.2012
Сообщений: 101
#1

Защита от ввода букв - C++

15.05.2012, 16:44. Просмотров 5401. Ответов 18
Метки нет (Все метки)

Всем привет.
Необходимо сделать защиту от ввода букв. числа не больше 40.
C
1
2
3
4
5
6
7
8
9
int size;
do
    {
    printf("\nВведите размер массива (не более 40): ");
    scanf("%d",&size);
    if(size<40)break;
    puts("\nВы задали размер больше 40, повторите попытку");
    }
    while(1);
пробовал использовать fflush, вроде получалось - при вводе буквы ввод появлялся заново, но при этом не получалось сделать условие, что меньше 40.
Прошу помочь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 16:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Защита от ввода букв (C++):

Защита от ввода букв
Нужно в программу вставить защиту от ввода букв. Что то у меня не получается....

Защита от ввода цифр/букв
Всем доброго времени суток! Написал вот такую программу #include&lt;iostream&gt;...

Защита от ввода букв и "+"/"-"
Как отредактировать программу , что бы она защищала от ввода букв и ''+''-'' ...

Защита ввода.
Как защитить размер матрицы от набора букв или символов?

Защита ввода
Подскажите как осуществить защиту от неправильного ввода то есть если...

Защита от некорректного ввода
Помогите сделать так, что при вводе букв программа продолжала работать:...

18
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 16:49 #2
C++
1
2
3
4
5
6
7
8
int size=0;
printf("\nВведите размер массива (не более 40): ");
scanf("%d",&size);
while((size<=0)||(size>40))
{
puts("\nВы задали размер больше 40, повторите попытку");
scanf("%d",&size);
}
Вроде так.
0
almostclever
1 / 1 / 1
Регистрация: 04.03.2012
Сообщений: 101
15.05.2012, 16:52  [ТС] #3
У вас так же как и у меня, просто ввод цифр, стоит ввести буквы и зацикливается
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 17:10 #4
Мне казалось, что ввод буквы и энтер scanf просто проигнорирует... Если нет, тогда не знаю...
0
rakota
35 / 35 / 12
Регистрация: 05.02.2012
Сообщений: 76
15.05.2012, 17:14 #5
Я мог бы вам посоветовать использовать функции ввода/вывода в стиле C++, а именно
C++
1
2
std::cout << "...";
std::cin >> size;
Если будет введена не цифра, то size примет значение равное нулю:
C++
1
2
3
4
if (size)
{
//была введена не буква, проводим другие проверки...
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
15.05.2012, 17:17 #6
almostclever, безопасному вводу посвящён целый блог http://www.cyberforum.ru/blogs/34326/blog279.html
1
-=ЮрА=-
Заблокирован
Автор FAQ
15.05.2012, 17:23 #7
almostclever, вот код обеспечивающий полную безопасность ввода инта + извещающий о неверном вводе и его причинах
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
#include <stdio.h>
#include <string.h>
 
int main()
{
    int param    = 0;
    char inpStr[1024];
    char bufStub = 0;
    while(1)
    {
        bufStub = 0;
        printf("Enter int : ");
        if((!scanf("%1023[^\n]%c",inpStr,&bufStub)) || bufStub != '\n')
        {
            if(printf("Empty input\n"))
                getchar();
        }
        else
        if(32 < strlen(inpStr))
            printf("Input is too large\n");
        else
        if(!sscanf(inpStr,"%d%c",&param,&bufStub) || bufStub != '\n')
            printf("Errors in input(input contains alphas or has unsupported format)\n");
        else
            printf("Your input %d\n",param);
    }
    return 0;
}
2
Миниатюры
Защита от ввода букв  
almostclever
1 / 1 / 1
Регистрация: 04.03.2012
Сообщений: 101
15.05.2012, 17:52  [ТС] #8
Большое спасибо
Переделал на свой лад, так как не требуется такая сложность обработки:
C
1
2
3
4
5
6
7
8
9
10
11
do
    {
        printf("\nВведите размер массива (не более 40): ");
        scanf("%s",inpStr);
        if(!sscanf(inpStr,"%d",&size))
            printf("\nВведите цифры");
        else
            if(size<40)break;
            puts("\nВы ввели неправильный параметр, повторите попытку");
    }
    while(1);
0
-=ЮрА=-
Заблокирован
Автор FAQ
15.05.2012, 17:57 #9
Цитата Сообщение от almostclever Посмотреть сообщение
маленько переделал на свой лад:
- а теперь введи пустую строку, т.е нажми Enter сразу без ввода числа. Хотябы уж гетчар введи. Мой код больше твоего не потому что заумно написано, а потому что он учитывает все возможные ошибки ввода - пустой ввод, буква, слишком большое значение
0
almostclever
1 / 1 / 1
Регистрация: 04.03.2012
Сообщений: 101
15.05.2012, 18:01  [ТС] #10
Я понимаю это все, и это все клева и нужно, но для моей задачи требуется минимум.
Длину пусть какую угодно вводят, все равно если будет больше 40, то цикл повторится.
А вот насчет пустого, да согласен, добавлю. Еще раз спасибо.
0
SuperMario
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 3
03.01.2013, 20:37 #11
-=ЮрА=- , отдельное спасибо за код, долго искал то что нужно и твой вариант мне полносnью подошел! Только в моем случае нужно было запретить ввод больше одного числа, я изменил 32 в этом кусочке кода на 1 и полностью решил свою проблему:
C++
1
2
if(1 < strlen(inpStr))
            printf("Input is too large\n");
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.01.2013, 20:51 #12
SuperMario, покажи полный код, просто хочу увидеть что ты ничего не упустил

Не по теме:

PS:А вот это радует!

Цитата Сообщение от SuperMario Посмотреть сообщение
-=ЮрА=- , отдельное спасибо за код, долго искал то что нужно и твой вариант мне полносnью подошел!
Люблю когда люди понимают что им хочу донести

0
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
03.01.2013, 21:01 #13
-=ЮрА=-, а почему вы использовали в свём примере scanf/printf? Потому что автору так надо? Просто мне кажется при помощи cin/cout тут удобнее можно сделать.
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.01.2013, 21:06 #14
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
-=ЮрА=-, а почему вы использовали в свём примере scanf/printf? Потому что автору так надо? Просто мне кажется при помощи cin/cout тут удобнее можно сделать.
- во превых да писал под Си, во вторых код позволяет фиксировать пустой ввод. По поводу плюсов - собственно буквально вчера выложил код на С++ через функцию-шаблон в своём блоге Безопасный ввод через функцию-шаблон
1
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
03.01.2013, 21:26 #15
посмотрел Ваш код.такой код сейчас в учебнике пару недель назад читал.(Язык программирования С++.Лекции и упражнения.Стивен Прата).Только там поток ввода очищался не при помощи cin.sync(), а при помощи простого цикла
C++
1
2
3
4
5
6
if(!cin>>some_number)
{
      cin.clear();
      while(cin.get() != '\n')
            continue;
}
Но ваш способ покрасивее.надо будет взятьна заметку.Спасибо за запись.
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.01.2013, 21:35 #16
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
посмотрел Ваш код.такой код сейчас в учебнике пару недель назад читал.(Язык программирования С++.Лекции и упражнения.Стивен Прата).Только там поток ввода очищался не при помощи cin.sync(), а при помощи простого цикла
- ну сама идея функции шаблона не нова, на счёт кода, я его писал без какого либо ученика. Почему у него не cin.clear() - потому что банально метод clear как я понял на linux-е не работает
0
SuperMario
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 3
09.01.2013, 19:33 #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
SuperMario, покажи полный код, просто хочу увидеть что ты ничего не упустил

Не по теме:

PS:А вот это радует!
Люблю когда люди понимают что им хочу донести

Да мне,честно говоря,стыдно показывать свой код : )).
Я просто переделал твою конструкцию немного для своей задачи:
Менюшка с тремя пунктами. Выбираешь 1 пункт - сложения трех чисел, 2 - умножение чисел, 3 - выход из программы. При выборе пункта меню и введении любых символов/чисел кроме 1, 2 или 3 прога должна выдавать сообщение: "неправильный пункт меню". Эту часть задачи мне удалось сделать, фактически, извратив твой код : )). Не совсем получается сделать проверку на ввод неправильных данных при введении трёх переменных до вызова функции умножения/сложения. Но даже когда вводищь правильные данные, например: 2, 12.347, 3 - то после выведения правильного результата в консоль мы еще дополнительно видим сообщение "Вы ввели несуществующий пункт меню...". Хотяб от этого сообщения избавиться : ) Видимо я все-таки что не учел. Прошу подсказать решение для этой проблемы. Сам код:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "stdafx.h"
#include <iostream>
#include <cstdlib> 
#include <conio.h>
#include <cmath>
 
using namespace std;
 
float slojenie (float f_n1, float f_n2, float f_n3) {
    return f_n1 + f_n2 + f_n3;
}
 
float ymnojenie (float f_n1, float f_n2, float f_n3) {
    return f_n1 * f_n2 * f_n3;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int param    = 0;
    char inpStr[1024];
    char bufStub = 0; 
    cout << "Вас приветствует программа для вычисления "<<endl;
    cout << "суммы и произведения трёх чисел.Пожалуйста, "<<endl;
    cout << "введите '1', '2' или '3' (без кавычек) "<<endl;
    cout << "для доступа к нужному пункту меню.  "<<endl<<endl;
    while(1)
    {   
        float n1, n2, n3;
        
        cout<<"              ::Меню программы:: "<<endl<<endl;
        cout<<"          '1'   - Сложение трех чисел."<<endl;
        cout<<"          '2'   - Умножение трех чисел чисел."<<endl;
        cout<<"          '3'   - Выйти из программы."<<endl<<endl;
        bufStub = 0;
        if((!(scanf)("%1023[^\n]%c",inpStr,&bufStub)) || bufStub != '\n')
        {
            cout << "Вы ввели несуществующий пункт меню. "<<endl;
            cout << "Пожалуйста, введите '1', '2' или '3' "<<endl;
            cout << "для доступа к нужному пункту меню.  "<<endl<<endl;
                getchar();
        }
        else
        if(1 < strlen(inpStr)) {
            cout << "Вы ввели несуществующий пункт меню. "<<endl;
            cout << "Пожалуйста, введите '1', '2' или '3' "<<endl;
            cout << "для доступа к нужному пункту меню.  "<<endl<<endl;
        }
        else
        if(!sscanf(inpStr,"%d%c",&param,&bufStub) || bufStub != '\n')
            printf("Errors in input(input contains alphas or has unsupported format)\n");
        else 
        if (param == 1) {
            cout << "Для сложения введите три числа: "<<endl;
            bufStub = 0;
            cin >> n1 >> n2 >> n3;
            cout<<endl;
            cout << "Результат сложения трёх чисел : "<<slojenie(n1, n2, n3)<<endl<<endl;
            
        }
        else if (param == 2) {
            cout << "Для умножения введите три числа: "<<endl;
            cin >> n1 >> n2 >> n3;
            cout<<endl;
            cout << "Результат умножения трёх чисел : "<<ymnojenie(n1, n2, n3)<<endl<<endl;
          }
        else if (param == 3) {
            return 0;
          }
 
        else if ((param > 3) && (param< 10)) {
            cout << "Вы ввели несуществующий пункт меню. "<<endl;
            cout << "Пожалуйста, введите '1', '2' или '3' "<<endl;
            cout << "для доступа к нужному пункту меню:  "<<endl<<endl;
        }
        else if (param == 0) {
            cout << "Вы ввели несуществующий пункт меню. "<<endl;
            cout << "Пожалуйста, введите '1', '2' или '3' "<<endl;
            cout << "для доступа к нужному пункту меню.  "<<endl<<endl;
        }
 
        else
            printf("Your input %d\n",param);
    }
    return 0;
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
10.01.2013, 11:19 #18
SuperMario, не хочу критиковать твой код(мне просто не хочется вносить острую критику в ответ), я показываю как делать твоё задание на плюсах.
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
using namespace std;
 
//Îáúÿâëÿåì ГґГіГ*êöèþ ГёГ*áëîГ*
//ÔóГ*êöèÿ ГўГҐГ°Г*ВёГІ ÈÑÒÈÍÀ åñëè ГЇГ*Г°Г*ìåòð val áûë âåäåГ* êîððåêòГ*Г®
//Гў ïðîòèâГ*îì ñëó÷Г*ГҐ âîçâðГ*ГІ îò ГґГіГ*êöèè ËÎÆÜ
template <class T>
bool SafeInput
(
    const char * msg,//ñîîáùåГ*ГЁГҐ êîòîðîå áóäåò ñîïóòñòâîâГ*ГІГј ââîäó
    T &val
);
//ГЋГЎГ°Г*áîò÷èêè ГЇГіГ*êòîâ ìåГ*Гѕ
void p1();
void p2();
 
int main()
{
    int iChoise    = 0;//ÏåðåìåГ*Г*Г*Гї îòâå÷Г*ГѕГ№Г*Гї Г§Г* ââîä ïîëüçîâГ*òåëÿ
    bool bContinue = true;//Г”Г*ëã ïðîäîëæåГ*ГЁГї Г°Г*áîòû
    while(bContinue)
    {
        cout<<"1 - Mult 3 digits"<<endl;
        cout<<"2 - Add  3 digits"<<endl;
        cout<<"0 - Exit"<<endl;
        if(!SafeInput("Your choise : ",iChoise))
            cout<<"Incorrect input"<<endl;
        else
        switch(iChoise)
        {
        case 1:
            p1();
            break;
        case 2:
            p2();
            break;
        case 0:
            bContinue = false;
            break;
        default:
            cout<<"Unsupported key pressed"<<endl;
            break;
        }
    }
    return 0;
}
 
template <class T>
bool SafeInput
(
    const char * msg,//ñîîáùåГ*ГЁГҐ êîòîðîå áóäåò ñîïóòñòâîâГ*ГІГј ââîäó
    T &val
)
{
    bool bOk = true;//ÔëГ*ГЈ ГіГ±ГЇГҐГёГ*îãî ââîäГ*
    cout<<msg;//Âûâîä Г*Г* ГЅГЄГ°Г*Г* ñîïóòñòâóþùåãî ñîîáùåГ*ГЁГї
    //ÏðîâåðêГ* Г*Г* êîððåêòГ*ûé ââîä äîëæГ*Г* ñîäåðæГ*ГІГј Г*ГҐ òîëüêî if(!(cin>>val) )
    //Г*Г® ГЁ ïðîâåðêó Г*Г* ГІГ® Г·ГІГ® ñòðîêГ* áîëåå Г*ГҐ ñîäåðæèò ñèìâîëîâ ГІ.ГҐ cin.get() != '\n'
    if(!(cin>>val) || cin.get() != '\n')
        bOk = false;
    if(!bOk)
    {
        cin.clear();//Ñáðîñ ГґГ«Г*ãîâ îøèáîê
        cin.sync();//ГЋГ·ГЁГ±ГІГЄГ* ГЎГіГґГҐГ°Г* ââîäГ*
    }
    return bOk;
}
 
void p1()
{
    double p1, p2, p3;
    cout<<"\tMult 3 digits"<<endl;
    if(!SafeInput("Enter 1-st parameter : ",p1))
        cout<<"Incorrect input"<<endl;
    else
    if(!SafeInput("Enter 2-nd parameter : ",p2))
        cout<<"Incorrect input"<<endl;
    else
    if(!SafeInput("Enter 3-rd parameter : ",p3))
        cout<<"Incorrect input"<<endl;
    else
        cout<<p1<<" * "<<p2<<" * "<<p3<<" = "<<p1 * p2 * p3<<endl;
}
 
void p2()
{
    double p1, p2, p3;
    cout<<"\tAdd 3 digits"<<endl;
    if(!SafeInput("Enter 1-st parameter : ",p1))
        cout<<"Incorrect input"<<endl;
    else
    if(!SafeInput("Enter 2-nd parameter : ",p2))
        cout<<"Incorrect input"<<endl;
    else
    if(!SafeInput("Enter 3-rd parameter : ",p3))
        cout<<"Incorrect input"<<endl;
    else
        cout<<p1<<" + "<<p2<<" + "<<p3<<" = "<<p1 + p2 + p3<<endl;
}
Отдельно об этом
Цитата Сообщение от SuperMario Посмотреть сообщение
if((!(scanf)("%1023[^\n]%c",inpStr,&bufStub)) || bufStub != '\n')
* * * * {
* * * * * * cout << "Вы ввели несуществующий пункт меню. "<<endl;
- да простят меня читатели, но я бы бил линейкой по рукам программистов пишущих одновременно на сурогате Си и С++! Си и С++ это два разных языка(хотя и близких) - писать на их смеси - очень плохой тон программирования (хотя да так можно).
0
Миниатюры
Защита от ввода букв  
-=ЮрА=-
10.01.2013, 11:26     Защита от ввода букв
  #19

Не по теме:

PS:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
писать на их смеси - очень плохой тон программирования (хотя да так можно).
100% кому то захочется написать - "а чё я же писал на смеси Си/С++ и рабоатет, чё ты туфту паришь" - предлагаю хотя бы ознакомиться с пунктом 6 -ть аттача (и это лишь малая доля того почему нельзя мешать языки)

0
10.01.2013, 11:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 11:26
Привет! Вот еще темы с ответами:

Защита от некорректного ввода
Здравствуйте! Нужно осуществить контроль при заполнении матрицы, если введены...

Защита от ввода символов
есть код в котором я ввожу цифры нужно сделать что бы через консоль я не могу...

Защита от неправильного ввода
Приветствую, делаю контрольную работу по программированию, основное задание...

Защита от некорректного ввода
Подскажите пожалуйста как доработать защиту от некорректного ввода: //...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru