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

Проверка на корректность входных данных - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:04     Проверка на корректность входных данных #1
Нужно написать программу, которая бы проверяла строку на корректность. Допустимый формат вот такой +7 (233) 555-11-22. Как это сделать? В голову ничего толкового не лезет. Написал вот такое, но оно почему-то не работает, в конце рушится и выдает вот такую ​​ошибку: Run-Time Check Failure #2 - Stack around the variable 'phone' was corrupted.
Самой функции проверки не реализовано, думаю что вы поможете
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
#include <iostream>
 
using namespace std;
 
class Phone
{
    friend ostream &operator<<(ostream &,const Phone&);
    friend istream &operator>>(istream &,Phone &);
private:
    char phon[15];
};
 
ostream &operator<<(ostream & out,const Phone &Obj)
{
    out<<Obj.phon;
 
    return out;
}
 
istream &operator>>(istream &inp,Phone &Obj)
{
    inp>>Obj.phon;
 
    return inp;
}
 
int main()
{
    Phone phone;
    cin>>phone;
    cout<<phone;
    system("pause>0");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:20     Проверка на корректность входных данных #2
Цитата Сообщение от The_bolT Посмотреть сообщение
но оно почему-то не работает, в конце рушится и выдает вот такую ​​ошибку: Run-Time Check Failure #2 - Stack around the variable 'phone' was corrupted.
Это если больше 14 символов ввести.

Добавлено через 2 минуты
И зачем эти массивы char если есть string?
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:22  [ТС]     Проверка на корректность входных данных #3
Цитата Сообщение от alsav22 Посмотреть сообщение
И зачем эти массивы char если есть string?
Нам еще не разрешают использовать string)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:23     Проверка на корректность входных данных #4
Ввод так лучше:
C++
1
2
3
4
5
6
7
8
9
string phon;
...
 
istream &operator>>(istream &inp, Phone &Obj)
{
    getline(inp, Obj.phon);
 
    return inp;
}
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:25  [ТС]     Проверка на корректность входных данных #5
Ну как с функцией проверки на корректность? Помогите, у меня голова уже не варит) Хотя бы скажите в какую сторону двигаться))
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:32     Проверка на корректность входных данных #6
Цитата Сообщение от The_bolT Посмотреть сообщение
Нам еще не разрешают использовать string)
Если не разрешают, тогда так:
C++
1
2
3
4
5
6
7
8
char phon[20];
...
istream &operator>>(istream &inp, Phone &Obj)
{
    inp.getline(Obj.phon, 20);
 
    return inp;
}
Добавлено через 1 минуту
Цитата Сообщение от The_bolT Посмотреть сообщение
Ну как с функцией проверки на корректность?
Перебор по символу.

Добавлено через 4 минуты
Нужно точнее с форматом определиться. Пробелы?
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:33  [ТС]     Проверка на корректность входных данных #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Пробелы?
Нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:33     Проверка на корректность входных данных #8
Хорошо бы словесно описать формат ввода. Тогда будет ясно, что нужно отслеживать.
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:35  [ТС]     Проверка на корректность входных данных #9
Все таки лучше пробелы не учитывать)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:37     Проверка на корректность входных данных #10
Например: номер должен начинаться с + , за которым следует цифра 7 или 8...

Добавлено через 2 минуты
И важны пробелы. Допускаются или нет. Если допускаются, то сколько. Цифры в номере, количество цифр в круглых скобках, значения цифр и т.д.
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:38  [ТС]     Проверка на корректность входных данных #11
Пользователь вводит номер телефона в следующем формате: сначала +, затем одно число, затем и должна идти открытая скобка (три числа и закрытая скобка) снова три числа затем тере - два числа, снова тере - опять два числа! При этом между символами и цифрами могут находиться пробелы, их не учитывать как ошибку!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:42     Проверка на корректность входных данных #12
После + до скобок одна цифра? Кроме 7 и 8 там может другая быть?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
09.03.2013, 20:44     Проверка на корректность входных данных #13
Предлагаю чтение осуществлять посимвольно, уже на этом этапе отбрасывая пробелы. Попроще будет.
Upd: точнее, это упростит дело, если пробелов может быть переменное число. Если только 0 или 1, то все равно.
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:45  [ТС]     Проверка на корректность входных данных #14
Цитата Сообщение от alsav22 Посмотреть сообщение
После + до скобок одна цифра?
Да.
Цитата Сообщение от alsav22 Посмотреть сообщение
Кроме 7 и 8 там может другая быть?
Может.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:52     Проверка на корректность входных данных #15
0x10, 6 пост.

Добавлено через 4 минуты
Цитата Сообщение от The_bolT Посмотреть сообщение
Может.
0 может?
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:53  [ТС]     Проверка на корректность входных данных #16
Цитата Сообщение от alsav22 Посмотреть сообщение
0 может?
Наверное нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:58     Проверка на корректность входных данных #17
0x10, прошу прощения, вы другое предлагаете, чем в 6 посте, это я не понял. Можно и посимвольное чтение.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 07:41     Проверка на корректность входных данных #18
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
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cctype>
using namespace std;
 
int fvecpar(const vector <string> &vec)
{
    //+7 (233) 555-11-22
    
    // количество и размер слов
    if (vec.size()    != 3 || 
        vec[0].size() != 2 || 
        vec[1].size() != 5 || 
        vec[2].size() != 9)   return 1;
    
    // +7
    if (vec[0][0]     != '+'  ||  !isdigit(vec[0][1])) return 2;
    // тут можно добавить варианты
    if (vec[0][1]     != '7'  && 
        vec[0][1]     != '8'    ) return 3;
    
    // (233)
    if (vec[1][0]     != '('  || 
        vec[1][4]     != ')'    ) return 4; 
    for (int i = 1; i < vec[1].size() - 2; ++i)
    {
        if (!isdigit(vec[1][i]))  return 5;
    }   
    
    //555-11-22
    int indf = vec[2].find('-');
    int indl = vec[2].find('-', indf + 1);
    if (indf == -1 || 
        indl == -1 || 
        indf !=  3 || 
        indl !=  6   ) return 6; 
    for (int i = 0; i < vec[2].size(); ++i)
    {
        if (i != indf && i != indl && !isdigit(vec[2][i])) return 7;
    }
    
    return 0;
}
 
int main()
{
    //+7 (233) 555-11-22
    // наличие минимум двух пробелов
    // количество пробелов в начале, в конце, между словами - любое
    
    vector <string> vec; // вектор для слов строки
    string str;
    
    getline(cin, str); // чтение строки
 
    stringstream s;
    s << str; // считанную строку в поток строк
    
    while (!s.eof()) // чтение по слову до EOF
    {
        s >> str; 
        if (str.empty()) break;
        vec.push_back(str);
        str.clear();
    }
    
    if (!vec.empty())
    {
        int err = fvecpar(vec);
    
        if (!err) cout << "Done!" << endl;
        else cout << "Error " << err << endl;
    }
    else cout << "Empty!" << endl; // пустой ввод
    
    system("pause");
    return 0;
}
Миниатюры
Проверка на корректность входных данных   Проверка на корректность входных данных   Проверка на корректность входных данных  

Проверка на корректность входных данных   Проверка на корректность входных данных  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 11:34     Проверка на корректность входных данных #19
Вариант без string:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <sstream>
#include <cctype>
using namespace std;
 
const int STR  = 60;  // максимальная длина введённой строки
const int WORD = 20;  // максимальная длина слова в строке
const int NWORD = 10; // максимальное количество слов в строке
 
int fvecpar(char vec[][WORD])
{
    //+7 (233) 555-11-22
    
    // количество и размер слов
    int n = 0;
    for (int i = 0; i < NWORD; ++i) // сколько слов в строке (n)
    {
        if(strlen(vec[i]) != 0) ++n;
 
    }
    if (             n != 3 ||
        strlen(vec[0]) != 2 || 
        strlen(vec[1]) != 5 || 
        strlen(vec[2]) != 9)   return 1;
    
    // +7
    if (vec[0][0]     != '+'  ||  !isdigit(vec[0][1])) return 2;
    // тут можно добавить варианты
    if (vec[0][1]     != '7'  && 
        vec[0][1]     != '8'    ) return 3;
    
    // (233)
    if (vec[1][0]     != '('  || 
        vec[1][4]     != ')'    ) return 4; 
    for (int i = 1; i < strlen(vec[1]) - 2; ++i)
    {
        if (!isdigit(vec[1][i]))  return 5;
    }   
    
    //555-11-22
    if (vec[2][3] !=  '-' || 
        vec[2][6] !=  '-'   ) return 6; 
    for (int i = 0; i < strlen(vec[2]); ++i)
    {
        if (i != 3 && i != 6 && !isdigit(vec[2][i])) return 7;
    }
    
    return 0;
}
 
int main()
{
    //+7 (233) 555-11-22
    // наличие минимум двух пробелов
    // количество пробелов в начале, в конце, между словами - любое
    
    static char vec[NWORD][WORD]; // массив для слов строки (static - для обнуления)
    char str[STR];
    
    cin.getline(str, STR); // чтение строки
 
    stringstream s;
    s << str; // считанную строку в поток строк
    
    int i = 0;
    while (!s.eof() && i < NWORD) // чтение по слову до EOF
    {
        char temp[WORD];
        s >> temp; 
        if (strlen(temp) == 0) break;
        strcpy(vec[i], temp);
        ++i;
    }
    
    if (i != 0)
    {
        int err = fvecpar(vec);
    
        if (!err) cout << "Done!" << endl;
        else cout << "Error " << err << endl;
    }
    else cout << "Empty!" << endl; // пустой ввод
    
    system("pause");
    return 0;
}


Добавлено через 26 минут
Вариант без stringstream:
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <cctype>
using namespace std;
 
const int WORD = 21; // максимальная длина слова в строке 20 символов
const int NWORD = 10; // максимальное количество слов в строке
 
int fvecpar(char vec[][WORD])
{
    //+7 (233) 555-11-22
    
    // количество и размер слов
    int n = 0;
    for (int i = 0; i < NWORD; ++i) // сколько слов в строке (n)
    {
        if(strlen(vec[i]) != 0) ++n;
 
    }
    if (             n != 3 ||
        strlen(vec[0]) != 2 || 
        strlen(vec[1]) != 5 || 
        strlen(vec[2]) != 9)   return 1;
    
    // +7
    if (vec[0][0]     != '+'  ||  !isdigit(vec[0][1])) return 2;
    // тут можно добавить варианты
    if (vec[0][1]     != '7'  && 
        vec[0][1]     != '8'    ) return 3;
    
    // (233)
    if (vec[1][0]     != '('  || 
        vec[1][4]     != ')'    ) return 4; 
    for (int i = 1; i < strlen(vec[1]) - 2; ++i)
    {
        if (!isdigit(vec[1][i]))  return 5;
    }   
    
    //555-11-22
    if (vec[2][3] !=  '-' || 
        vec[2][6] !=  '-'   ) return 6; 
    for (int i = 0; i < strlen(vec[2]); ++i)
    {
        if (i != 3 && i != 6 && !isdigit(vec[2][i])) return 7;
    }
    
    return 0;
}
 
int main()
{
    //+7 (233) 555-11-22
    // наличие минимум двух пробелов
    // количество пробелов в начале, в конце, между словами - любое
    
    static char vec[NWORD][WORD]; // массив для слов строки (static - для обнуления)
     
    int i = 0, j;
    char ch = ' ';
    while  (ch != '\n' && i < NWORD) // чтение по слову 
    {
        while (cin.peek() == ' ') cin.get(); // убираем лишние пробелы
        
        char temp[WORD] = {'\0'}; // массив для слова
        
        for (j = 0; j < WORD - 1; ++j)   // чтение (не более чем WORD - 1) по символу до пробела или '\n'
        {
            cin.get(ch);
            if (ch != ' ' && ch != '\n')
                temp[j] = ch;
            else break; 
            
        }
        
        if (strlen(temp) == 0) break; // пустой ввод
        
        temp[j] = '\0'; // завершение слова
 
        strcpy(vec[i], temp); // слово в массив
        ++i;
    }
    
    if (i != 0)
    {
        int err = fvecpar(vec);
    
        if (!err) cout << "Done!" << endl;
        else cout << "Error " << err << endl;
    }
    else cout << "Empty!" << endl; // пустой ввод
    
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2013, 13:14     Проверка на корректность входных данных
Еще ссылки по теме:

Проверка правильности входных параметров конструктора C++
Проверка на корректность введенных данных C++
C++ Проверка указателя на корректность

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

Или воспользуйтесь поиском по форуму:
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
10.03.2013, 13:14  [ТС]     Проверка на корректность входных данных #20
alsav22, Спасибо вам! Но у меня есть еще пару вопросов: зачем там эта проверка?
C++
1
2
3
4
if (             n != 3 ||
        strlen(vec[0]) != 2 || 
        strlen(vec[1]) != 5 || 
        strlen(vec[2]) != 9)   return 1;
И почему нужно использовать именно двухмерный массив, почему нельзя обойтись простым массивом?
Yandex
Объявления
10.03.2013, 13:14     Проверка на корректность входных данных
Ответ Создать тему
Опции темы

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