Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
1

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

09.03.2013, 20:04. Показов 4210. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно написать программу, которая бы проверяла строку на корректность. Допустимый формат вот такой +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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2013, 20:04
Ответы с готовыми решениями:

Проверка входных данных на корректность
Модифицировать программу так, чтобы в случаи ввода некорректных данных сообщалась ошибка с...

Проверка входных данных: вызов и обработка исключения
Всем привет. Не могу разобраться с проверкой входных данных. Нужно чтобы если я ввел какой либо...

Проверка на корректность введенных данных
дана задача ввести номер телефона пробел и дата в формате день. месяц. год. Выполнить простейшую...

Проверка на корректность вводимых данных
В моём коде должны быть ТОЛЬКО вводимые числа от -1000 до 1000 (с плавающей точкой). Если...

24
5498 / 4893 / 831
Регистрация: 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?
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:22  [ТС] 3
Цитата Сообщение от alsav22 Посмотреть сообщение
И зачем эти массивы char если есть string?
Нам еще не разрешают использовать string)
0
5498 / 4893 / 831
Регистрация: 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;
}
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:25  [ТС] 5
Ну как с функцией проверки на корректность? Помогите, у меня голова уже не варит) Хотя бы скажите в какую сторону двигаться))
0
5498 / 4893 / 831
Регистрация: 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 минуты
Нужно точнее с форматом определиться. Пробелы?
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:33  [ТС] 7
Цитата Сообщение от alsav22 Посмотреть сообщение
Пробелы?
Нет.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:33 8
Хорошо бы словесно описать формат ввода. Тогда будет ясно, что нужно отслеживать.
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:35  [ТС] 9
Все таки лучше пробелы не учитывать)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:37 10
Например: номер должен начинаться с + , за которым следует цифра 7 или 8...

Добавлено через 2 минуты
И важны пробелы. Допускаются или нет. Если допускаются, то сколько. Цифры в номере, количество цифр в круглых скобках, значения цифр и т.д.
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:38  [ТС] 11
Пользователь вводит номер телефона в следующем формате: сначала +, затем одно число, затем и должна идти открытая скобка (три числа и закрытая скобка) снова три числа затем тере - два числа, снова тере - опять два числа! При этом между символами и цифрами могут находиться пробелы, их не учитывать как ошибку!
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:42 12
После + до скобок одна цифра? Кроме 7 и 8 там может другая быть?
1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.03.2013, 20:44 13
Предлагаю чтение осуществлять посимвольно, уже на этом этапе отбрасывая пробелы. Попроще будет.
Upd: точнее, это упростит дело, если пробелов может быть переменное число. Если только 0 или 1, то все равно.
0
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:45  [ТС] 14
Цитата Сообщение от alsav22 Посмотреть сообщение
После + до скобок одна цифра?
Да.
Цитата Сообщение от alsav22 Посмотреть сообщение
Кроме 7 и 8 там может другая быть?
Может.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:52 15
0x10, 6 пост.

Добавлено через 4 минуты
Цитата Сообщение от The_bolT Посмотреть сообщение
Может.
0 может?
0
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:53  [ТС] 16
Цитата Сообщение от alsav22 Посмотреть сообщение
0 может?
Наверное нет.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.03.2013, 20:58 17
0x10, прошу прощения, вы другое предлагаете, чем в 6 посте, это я не понял. Можно и посимвольное чтение.
0
5498 / 4893 / 831
Регистрация: 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;
}
Миниатюры
Проверка на корректность входных данных   Проверка на корректность входных данных   Проверка на корректность входных данных  

Проверка на корректность входных данных   Проверка на корректность входных данных  
1
5498 / 4893 / 831
Регистрация: 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;
}
1
73 / 73 / 12
Регистрация: 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;
И почему нужно использовать именно двухмерный массив, почему нельзя обойтись простым массивом?
0
10.03.2013, 13:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2013, 13:14
Помогаю со студенческими работами здесь

Проверка введенных данных cin на корректность
Вот кусок кода : input1 : cout&lt;&lt;&quot;Введите количество животных которые когда либо жили у вас : &quot;;...

Портирование кода на С++ (проверка вводимых данных пользователем на корректность)
Требуется портировать код с С# на С++. Код на шарпе - очень простой. В нем не используются языковые...

Проверка входных данных
Нужно что бы после каждого ввода &quot;а&quot;, проверялось 0&lt;=a&lt;100. ConsoleKeyInfo a; ...

Проверка входных данных
есть список допустимых команд, например: Старт, Стоп, Сканирование. Необходимо чтобы при вводе...

Проверка входных данных
Как сделать проверку входных данных? (нужно чтобы пользователь задавал матрицу, пример матрицы в...

Проверка Входных данных на соответствие
Нужно чтобы если Входной символ Symbol не (+, -,*,/) то компилятор писал об этом как ошибка ? ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru