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

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

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

C++ Защита ввода.
Защита от некорректного ввода C++
Защита от ввода букв C++
защита от ввода символов C++
Защита ввода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
17 / 17 / 1
Регистрация: 09.01.2013
Сообщений: 158
25.06.2013, 09:42  [ТС]     Защита от ввода больших значений #3
Ну можно, но прога виснет и не хочет выполняться дальше.
Миниатюры
Защита от ввода больших значений  
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.06.2013, 09:44     Защита от ввода больших значений #4
вводите свои данные в строку, у которой нет ограничения. после ввода проверяйте эту строку на валидность и если все ок - преобразовывайте в целевой тип данных.
Ryabchik
17 / 17 / 1
Регистрация: 09.01.2013
Сообщений: 158
25.06.2013, 09:45  [ТС]     Защита от ввода больших значений #5
Цитата Сообщение от DU Посмотреть сообщение
проверяйте эту строку на валидность
В смысле считать число разрядов и сравнивать с наибольшим разрешенным?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 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
1477 / 1053 / 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
293 / 273 / 35
Регистрация: 19.02.2010
Сообщений: 1,205
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
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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++

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

Или воспользуйтесь поиском по форуму:
Ryabchik
17 / 17 / 1
Регистрация: 09.01.2013
Сообщений: 158
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     Защита от ввода больших значений
Ответ Создать тему
Опции темы

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