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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.96
almostclever
1 / 1 / 0
Регистрация: 04.03.2012
Сообщений: 101
15.05.2012, 16:44     Защита от ввода букв #1
Всем привет.
Необходимо сделать защиту от ввода букв. числа не больше 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.
Прошу помочь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 16:44     Защита от ввода букв
Посмотрите здесь:

C++ Защита ввода.
Защита от некорректного ввода C++
Защита от ввода букв C++
защита от ввода символов C++
Защита ввода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 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);
}
Вроде так.
almostclever
1 / 1 / 0
Регистрация: 04.03.2012
Сообщений: 101
15.05.2012, 16:52  [ТС]     Защита от ввода букв #3
У вас так же как и у меня, просто ввод цифр, стоит ввести буквы и зацикливается
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
15.05.2012, 17:10     Защита от ввода букв #4
Мне казалось, что ввод буквы и энтер scanf просто проигнорирует... Если нет, тогда не знаю...
rakota
35 / 35 / 1
Регистрация: 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)
{
//была введена не буква, проводим другие проверки...
}
-=ЮрА=-
Заблокирован
Автор FAQ
15.05.2012, 17:17     Защита от ввода букв #6
almostclever, безопасному вводу посвящён целый блог http://www.cyberforum.ru/blogs/34326/blog279.html
-=ЮрА=-
Заблокирован
Автор 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;
}
Миниатюры
Защита от ввода букв  
almostclever
1 / 1 / 0
Регистрация: 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);
-=ЮрА=-
Заблокирован
Автор FAQ
15.05.2012, 17:57     Защита от ввода букв #9
Цитата Сообщение от almostclever Посмотреть сообщение
маленько переделал на свой лад:
- а теперь введи пустую строку, т.е нажми Enter сразу без ввода числа. Хотябы уж гетчар введи. Мой код больше твоего не потому что заумно написано, а потому что он учитывает все возможные ошибки ввода - пустой ввод, буква, слишком большое значение
almostclever
1 / 1 / 0
Регистрация: 04.03.2012
Сообщений: 101
15.05.2012, 18:01  [ТС]     Защита от ввода букв #10
Я понимаю это все, и это все клева и нужно, но для моей задачи требуется минимум.
Длину пусть какую угодно вводят, все равно если будет больше 40, то цикл повторится.
А вот насчет пустого, да согласен, добавлю. Еще раз спасибо.
SuperMario
 Аватар для 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");
-=ЮрА=-
Заблокирован
Автор FAQ
03.01.2013, 20:51     Защита от ввода букв #12
SuperMario, покажи полный код, просто хочу увидеть что ты ничего не упустил

Не по теме:

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

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

ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
03.01.2013, 21:01     Защита от ввода букв #13
-=ЮрА=-, а почему вы использовали в свём примере scanf/printf? Потому что автору так надо? Просто мне кажется при помощи cin/cout тут удобнее можно сделать.
-=ЮрА=-
Заблокирован
Автор FAQ
03.01.2013, 21:06     Защита от ввода букв #14
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
-=ЮрА=-, а почему вы использовали в свём примере scanf/printf? Потому что автору так надо? Просто мне кажется при помощи cin/cout тут удобнее можно сделать.
- во превых да писал под Си, во вторых код позволяет фиксировать пустой ввод. По поводу плюсов - собственно буквально вчера выложил код на С++ через функцию-шаблон в своём блоге Безопасный ввод через функцию-шаблон
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 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;
}
Но ваш способ покрасивее.надо будет взятьна заметку.Спасибо за запись.
-=ЮрА=-
Заблокирован
Автор FAQ
03.01.2013, 21:35     Защита от ввода букв #16
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
посмотрел Ваш код.такой код сейчас в учебнике пару недель назад читал.(Язык программирования С++.Лекции и упражнения.Стивен Прата).Только там поток ввода очищался не при помощи cin.sync(), а при помощи простого цикла
- ну сама идея функции шаблона не нова, на счёт кода, я его писал без какого либо ученика. Почему у него не cin.clear() - потому что банально метод clear как я понял на linux-е не работает
SuperMario
 Аватар для 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;
}
-=ЮрА=-
Заблокирован
Автор 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;
- да простят меня читатели, но я бы бил линейкой по рукам программистов пишущих одновременно на сурогате Си и С++! Си и С++ это два разных языка(хотя и близких) - писать на их смеси - очень плохой тон программирования (хотя да так можно).
Миниатюры
Защита от ввода букв  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 11:26     Защита от ввода букв
Еще ссылки по теме:

Защита от некорректного ввода C++
Защита от некорректного ввода C++
Защита от некорректного ввода C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
10.01.2013, 11:26     Защита от ввода букв
  #19

Не по теме:

PS:

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

Yandex
Объявления
10.01.2013, 11:26     Защита от ввода букв
Ответ Создать тему
Опции темы

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