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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 161
#1

Защита от ввода больших значений - C++

24.06.2013, 17:01. Просмотров 554. Ответов 9
Метки нет (Все метки)

Здравствуйте. Подскажите, как проверять ввод на слишком большие значения?
Можно поциферно записывать в массив, считать число разрядов и так далее, но это потребует уникального подхода для каждого типа данных.
В плюсах же есть функции на любой случай
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2013, 17:01     Защита от ввода больших значений
Посмотрите здесь:

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

Защита ввода - C++
Подскажите как осуществить защиту от неправильного ввода то есть если переменная типа int как сделать так что бы пользователь не мог ...

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

Защита от некорректного ввода - C++
Будьте добры, помогите написать защиту от дурака на ввод массива элементы которого тип float Буду очень благодарен.

Защита от ввода букв - C++
Нужно в программу вставить защиту от ввода букв. Что то у меня не получается. (В программе вводится только цифра) #include...

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

Защита от некорректного ввода - C++
Подскажите пожалуйста как доработать защиту от некорректного ввода: // ConsoleApplication4.cpp : Defines the entry point for the console...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
24.06.2013, 17:34     Защита от ввода больших значений #2
Вот так, наверное, можно
C++
1
2
3
4
5
    int r;
    if (cin>>r)
        cout<<"ok";
    else
    cout<<"error";
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 161
25.06.2013, 09:42  [ТС]     Защита от ввода больших значений #3
Ну можно, но прога виснет и не хочет выполняться дальше.
Миниатюры
Защита от ввода больших значений  
DU
1481 / 1057 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.06.2013, 09:44     Защита от ввода больших значений #4
вводите свои данные в строку, у которой нет ограничения. после ввода проверяйте эту строку на валидность и если все ок - преобразовывайте в целевой тип данных.
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 161
25.06.2013, 09:45  [ТС]     Защита от ввода больших значений #5
Цитата Сообщение от DU Посмотреть сообщение
проверяйте эту строку на валидность
В смысле считать число разрядов и сравнивать с наибольшим разрешенным?
SatanaXIII
Супер-модератор
Эксперт С++
5602 / 2636 / 242
Регистрация: 01.11.2011
Сообщений: 6,495
Завершенные тесты: 1
25.06.2013, 10:09     Защита от ввода больших значений #6
Это ж плюсы. Здесь есть замечательные контейнеры.
Даже вот с таким велосипедом.
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
#include <stack.h>
#include <iostream.h>
#include <conio.h>
 
int main()
{
 
stack<int> a;
char ch = NULL;
while((int)ch!=13)
  {
  ch = getch();
  int i = (int)ch;
  if((int)ch>=48 && (int)ch<=57)
    {
    a.push(ch);
    cout << ch;
    }
  if((int)ch==8)
    {
    cout << ch << ' ' << ch;
    a.pop();
    }
  }
 
 
cout << endl << a.size();
 
 
cin.ignore();
return 0;
}
DU
1481 / 1057 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.06.2013, 23:11     Защита от ввода больших значений #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
42
43
44
#include <string>
#include <limits>
#include <iostream>
 
int main()
{
 
  {
    //std::string inputStr;
    //std::cin >> inputStr;
    std::string inputStr = "1114294967296"; // чтобы не было наглядее.
    std::string maxUInt = std::to_string(std::numeric_limits<unsigned>::max());
    // тут еще надо проверять на то, что ввели только цифры
    // или более сложные проверки в случае наличия знаков
    // или еще какого-то специфического формата.
    // фокус в том, что во время этих проверок можно точно
    // определить, что именно неверно в веденной строке,
    // в отличае от случая проверок за счет того, что
    // поток ввода ломается, когда ожидается ввод числа,
    // а юзер вводит какие-то неправильные символы.
    if (inputStr.length() > maxUInt.length() || inputStr > maxUInt)
    {
      std::cout << "\ninputStr is to big." << std::endl;
      std::cout << "  inputStr = " << inputStr << std::endl;
      std::cout << "  maxUInt = " << maxUInt << std::endl;
    }
  }
 
  {
    //std::string inputStr;
    //std::cin >> inputStr;
    std::string inputStr = "12345"; // чтобы не было наглядее.
    std::string maxUInt = std::to_string(std::numeric_limits<unsigned>::max());
    if (inputStr.length() <= maxUInt.length() && inputStr <= maxUInt)
    {
      std::cout << "\ninputStr is ok." << std::endl;
      std::cout << "  inputStr = " << inputStr << std::endl;
      std::cout << "  maxUInt = " << maxUInt << std::endl;
    }
    // тут преобразовываем введенную строку в unsigned и делаем с этим чтото дальше.
  }
 
  return 0;
}
VTsaregorodtsev
337 / 317 / 45
Регистрация: 19.02.2010
Сообщений: 1,354
26.06.2013, 23:13     Защита от ввода больших значений #8
@Ryabchik, а ещё есть вероятность, что строковый класс может выкидывать исключение при попытке конверсии неверного значения.
В С++Билдере я обычно пользуюсь таким кодом на основе класса AnsiString:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AnsiString Text; //сюда будем пихать строковое значение
...
//запихали - конвертируем в целое (а можно - и в плавучку, методом ToDouble())
int Val;
try {
 Val=Text.ToInt();
}
catch (...) {
 return ...;
}
if ( Val<Min )
 ...
else if ( Val>Max )
 ...
//всё - у нас валидное значение, попадающее в нужный диапазон - можно с ним делать все дальнейшие действия
...
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
27.06.2013, 01:31     Защита от ввода больших значений #9
@Ryabchik, вводите строку и переводите её в число с помощью strtol и подобных ей функций.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 08:15     Защита от ввода больших значений
Еще ссылки по теме:

Защита от некорректного ввода - C++
Помогите, пожалуйста, с защитой от некорректного ввода! Программа выполняет задания с помощью рекурсии. Хотел написать защиту на ввод...

Защита от некорректного ввода - C++
Помогите сделать так, что при вводе букв программа продолжала работать: запрещала ввод букв(только цифры) или просто не учитывала их. Как...

Защита от ввода букв - C++
Всем привет. Необходимо сделать защиту от ввода букв. числа не больше 40. int size; do { printf(&quot;\nВведите размер массива...

Защита от некорректного ввода - C++
Приветствую, помогите, пожалуйста, реализовать защиту от некорректного ввода. Должны быть допустимы только числовые значения. double...

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


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

Или воспользуйтесь поиском по форуму:
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 161
27.06.2013, 08:15  [ТС]     Защита от ввода больших значений #10
Вау. Не думал, что есть столько способов) Всем спасибо, сейчас все попробую.

Добавлено через 21 минуту
Вот кстати, еще нашел на форуме:
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
#include <iostream>
#include <limits>
 
using std :: cin;
using std :: cout;
using std :: istream;
using std :: numeric_limits;
using std :: streamsize;
 
int main()
{
    double number;
 
    do
    {
        try
        {
           cin.exceptions (istream :: failbit | istream :: badbit);
           cin >> number;
        }
        
        catch (istream :: failure)
        {
            cout << "Error!\n";
            system ("pause");
            
            cin.clear();
            cin.ignore (numeric_limits <streamsize>::max(), '\n');
            continue;
        }
        
    } while (number >= 0 );
 
    cout << "finished\n";
    
    system ("pause");
    return 0;
}
Тоже работает
Yandex
Объявления
27.06.2013, 08:15     Защита от ввода больших значений
Ответ Создать тему
Опции темы

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