Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Ryabchik
18 / 19 / 0
Регистрация: 09.01.2013
Сообщений: 168
1

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

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

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

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

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

Защита от ввода букв
Всем привет. Необходимо сделать защиту от ввода букв. числа не больше 40. int...

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

Защита ввода чисел
Есть рабочий код. Объясните, пожалуйста, как он работает?(именно сам цикл)...

9
ViktorKozlov
134 / 126 / 59
Регистрация: 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";
0
Ryabchik
18 / 19 / 0
Регистрация: 09.01.2013
Сообщений: 168
25.06.2013, 09:42  [ТС] 3
Ну можно, но прога виснет и не хочет выполняться дальше.
0
Миниатюры
Защита от ввода больших значений  
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
25.06.2013, 09:44 4
вводите свои данные в строку, у которой нет ограничения. после ввода проверяйте эту строку на валидность и если все ок - преобразовывайте в целевой тип данных.
0
Ryabchik
18 / 19 / 0
Регистрация: 09.01.2013
Сообщений: 168
25.06.2013, 09:45  [ТС] 5
Цитата Сообщение от DU Посмотреть сообщение
проверяйте эту строку на валидность
В смысле считать число разрядов и сравнивать с наибольшим разрешенным?
0
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 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;
}
0
DU
1486 / 1132 / 164
Регистрация: 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;
}
1
VTsaregorodtsev
525 / 464 / 68
Регистрация: 19.02.2010
Сообщений: 1,747
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 )
 ...
//всё - у нас валидное значение, попадающее в нужный диапазон - можно с ним делать все дальнейшие действия
...
0
rangerx
1942 / 1551 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
27.06.2013, 01:31 9
@Ryabchik, вводите строку и переводите её в число с помощью strtol и подобных ей функций.
0
Ryabchik
18 / 19 / 0
Регистрация: 09.01.2013
Сообщений: 168
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;
}
Тоже работает
0
27.06.2013, 08:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 08:15

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

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

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


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

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

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