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

Проверка на введенные данные - C++

Восстановить пароль Регистрация
 
stdafx
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
06.11.2012, 22:08     Проверка на введенные данные #1
Могу ввести числа в восьмеричной, десятичной или шестнадцатеричной системе счисления.
Но нужно потом перевести все равно в десятичную
Проверка на мой вгляд такая, поправьте если что:
1) убирать "-" если есть, потом запомнить что число отрицательное, либо другой способ
Примеры
-9999 = -9999
--12 = минус не на первой позиции
2) определить, какая с.с.
a) если число начинается с "0"
проверять следующую цифру
1) если дальше идёт "х" - значит число 16ричное
но тоже свои проверки (только большие буквы и т.д.)
Примеры:
0x39
0x00000AB - можно удалить нули для облегчения проверки
00xAB = недопустимые символы
0х8as8 = недопустимые символы
2) если нет "х", значит 8ричная с.с.
>8 и т.д.
Пример
0000026
б) если с != 0 - значит 10чная
Примеры
25
10000
3) проверить, влазит ли в int от -32768 до 32767

С переводом:
25 = 25
-9999 = -9999
0000026 = 22
-0x1 = -1
0xFF = 255

as89 = недопустимые символы
888588 = выход за допустимый диапазон
--12 = минус не на первой позиции
00xAB = недопустимые символы
0A = недопустимые символы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
06.11.2012, 22:12     Проверка на введенные данные #2
Как пример для проверки на недопустимые символы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool isCorrected(char m_symbol)
{
    if ((m_symbol == '\n') || (m_symbol != '1' && m_symbol != '0'))
        return false;
    else
        return true;
}
int main(void)
{
    char symbol;
 
    cout << "Введите число в двоичной системе счисления (0<x<2).\n";
    do
    {
        cin.get(symbol);
 
        if (!isCorrected(symbol))
            continue;
                ...
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
07.11.2012, 14:21     Проверка на введенные данные #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
#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <climits>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
 
typedef std::ios_base& (*Pointer)(std::ios_base&);
 
int main ()
{
    if(sizeof(long long) > sizeof(int))
    {
        long long ll;
        std::string s;
        // Таблица соответствий
        std::map<Pointer, boost::regex> map;
        map.insert(std::make_pair(&std::hex, "[+-]?0[xX][\\da-fA-F]{1,8}"));
        map.insert(std::make_pair(&std::oct, "[+-]?0[0-7]{1,11}"));
        map.insert(std::make_pair(&std::dec, "[+-]?[1-9]\\d{0,9}"));
        //
        std::stringstream ss;
        // Лимиты
        std::cout << std::showbase << "Limits:\n";
        std::cout << "INT_MAX hex: " << std::hex << INT_MAX << '\n' << "INT_MIN hex: -" << INT_MIN << std::endl;
        std::cout << "INT_MAX oct: " << std::oct << INT_MAX << '\n' << "INT_MIN oct: -" << INT_MIN << std::endl;
        std::cout << "INT_MAX: " << std::dec << INT_MAX << '\n' << "INT_MIN: " << INT_MIN << std::endl;
        std::cout << '\n';
        //
        bool correct;
        while(true)
        {
            std::cout << "Input int : ";
            std::getline(std::cin, s);
            correct = false;
            for(auto const& pair : map)
            {
                if(boost::regex_match(s, pair.second))
                {
                    correct = true;
                    ss.str(s);
                    ss >> pair.first >> ll;
                    if(INT_MIN <= ll && INT_MAX >= ll)
                        std::cout << ll << std::endl;
                    else
                        std::cout << "Overflow: " << ll << std::endl;
                    ss.clear();
                    break;
                }
            }
            if(!correct)
                std::cerr << "Format not provided" << std::endl;
        }
    }
    return 0;
}
stdafx
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
07.11.2012, 23:42  [ТС]     Проверка на введенные данные #4
Цитата Сообщение от igorrr37 Посмотреть сообщение
Вроде бы работает
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
#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <climits>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
 
typedef std::ios_base& (*Pointer)(std::ios_base&);
 
int main ()
{
    if(sizeof(long long) > sizeof(int))
    {
        long long ll;
        std::string s;
        // Таблица соответствий
        std::map<Pointer, boost::regex> map;
        map.insert(std::make_pair(&std::hex, "[+-]?0[xX][\\da-fA-F]{1,8}"));
        map.insert(std::make_pair(&std::oct, "[+-]?0[0-7]{1,11}"));
        map.insert(std::make_pair(&std::dec, "[+-]?[1-9]\\d{0,9}"));
        //
        std::stringstream ss;
        // Лимиты
        std::cout << std::showbase << "Limits:\n";
        std::cout << "INT_MAX hex: " << std::hex << INT_MAX << '\n' << "INT_MIN hex: -" << INT_MIN << std::endl;
        std::cout << "INT_MAX oct: " << std::oct << INT_MAX << '\n' << "INT_MIN oct: -" << INT_MIN << std::endl;
        std::cout << "INT_MAX: " << std::dec << INT_MAX << '\n' << "INT_MIN: " << INT_MIN << std::endl;
        std::cout << '\n';
        //
        bool correct;
        while(true)
        {
            std::cout << "Input int : ";
            std::getline(std::cin, s);
            correct = false;
            for(auto const& pair : map)
            {
                if(boost::regex_match(s, pair.second))
                {
                    correct = true;
                    ss.str(s);
                    ss >> pair.first >> ll;
                    if(INT_MIN <= ll && INT_MAX >= ll)
                        std::cout << ll << std::endl;
                    else
                        std::cout << "Overflow: " << ll << std::endl;
                    ss.clear();
                    break;
                }
            }
            if(!correct)
                std::cerr << "Format not provided" << std::endl;
        }
    }
    return 0;
}
Я не очень-то разбираюсь с Boost (вообще впервые вижу), если не удосужит, можете как-нибудь проще составить?
stdafx
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
10.11.2012, 00:10  [ТС]     Проверка на введенные данные #5
Есть еще у кого мысли?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
10.11.2012, 00:15     Проверка на введенные данные #6
stdafx, мысль одна - надо писать парсер. Небольшой,, но гордый парсер
Попробуйте решать задачу постепенно. Начните, например, с минуса. Напишите функцию, которая определяет, все ли в порядке с минусом. Пусть возвращает -1, если ошибка, 0 если все ок и минуса нет, 1 если все ок и минус есть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2012, 18:39     Проверка на введенные данные
Еще ссылки по теме:

Проверка строки на вводимые данные C++
C++ Проверить введенные данные, и если они некорректны - вывести сообщение
Программа не считывает введенные данные C++

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

Или воспользуйтесь поиском по форуму:
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
10.11.2012, 18:39     Проверка на введенные данные #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
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <string>
#include <cstdlib>
#include <cerrno>
#include <climits>
 
int main()
{
    std::cout << std::showbase << "Limits:\n";
    std::cout << "INT_MAX hex: " << std::hex << INT_MAX << '\n' << "INT_MIN hex: -" << INT_MIN << std::endl;
    std::cout << "INT_MAX oct: " << std::oct << INT_MAX << '\n' << "INT_MIN oct: -" << INT_MIN << std::endl;
    std::cout << "INT_MAX: " << std::dec << INT_MAX << '\n' << "INT_MIN: " << INT_MIN << std::endl;
    std::cout << '\n';
    enum State
    {
        Base = 0, Sign = 1, Dec  = 2, Hoct = 3, Hex  = 4, Oct  = 5, Inc  = 6
    };
    std::string s;
    long n;
    bool format;
    State state;
    while(true)
    {
        std::cout << "Input long:\n";
        std::getline(std::cin, s);
        state = Base;
        format = false;
        for(std::string::const_iterator cib = s.begin(), cie = s.end(); cib != cie; ++cib)
        {
            switch(*cib)
            {
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                    switch(state)
                    {
                        case Hex:
                        case Oct:
                        case Inc:
                            break;
                        case Hoct:
                            state = Oct;
                            break;
                        default:
                            state = Dec;
                            break;
                    }
                    break;
                case '+':
                case '-':
                    switch(state)
                    {
                        case Base:
                            state = Sign;
                            break;
                        default:
                            state = Inc;
                            break;
                    }
                    break;
                case '0':
                    switch(state)
                    {
                        case Base:
                        case Sign:
                            state = Hoct;
                            break;
                        case Hoct:
                            state = Oct;
                            break;
                        default:
                            break;
                    }
                    break;
                case 'x':
                case 'X':
                    switch(state)
                    {
                        case Hoct:
                            state = Hex;
                            break;
                        default:
                            state = Inc;
                            break;
                    }
                    break;
                case '8':
                case '9':
                    switch(state)
                    {
                        case Base:
                        case Dec:
                        case Sign:
                            state = Dec;
                            break;
                        case Hex:
                            break;
                        default:
                            state = Inc;
                            break;
                    }
                    break;
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                    switch(state)
                    {
                        case Hex:
                            break;
                        default:
                            state = Inc;
                            break;
                    }
                    break;
                default:
                    state = Inc;
                    break;
            }
        }
        //std::cout << "state: " << state << std::endl;
        switch(state)
        {
            case Dec:
            case Hoct:
                n = strtol(s.c_str(), 0, 10);
                std::cout << "dec, ";
                format = true;
                break;
            case Hex:
                n = strtol(s.c_str(), 0, 16);
                std::cout << "hex, ";
                format = true;
                break;
            case Oct:
                n = strtol(s.c_str(), 0, 8);
                std::cout << "oct, ";
                format = true;
                break;
        }
        if(!format)
            std::cerr << "format not provided" << std::endl;
        else if(ERANGE == errno)
            std::cout << "overflow" << std::endl;
        else
            std::cout << n << std::endl;
        std::cout << std::endl;
    }
    return 0;
}
Yandex
Объявления
10.11.2012, 18:39     Проверка на введенные данные
Ответ Создать тему
Опции темы

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