Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
#1

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

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

Нужно написать программу, которая бы проверяла строку на корректность. Допустимый формат вот такой +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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2013, 20:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка на корректность входных данных (C++):

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

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

Проверка введенных данных cin на корректность - C++
Вот кусок кода : input1 : cout&lt;&lt;&quot;Введите количество животных которые когда либо жили у вас : &quot;; cin&gt;&gt;amountPats; if (!cin) { ...

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

Проверка правильности входных параметров конструктора - C++
Как проверить допустимость передаваемых входных параметров конструктора класса? Точнее, проверку параметров конечно, можно сделать в теле...

Проверка на корректность операции - C++
Добрый день. Не знаю как лучше задать вопрос. Смысл идеи таков: Есть интерфейс типа данных (IVariable) и наследники от него,...

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

Проверка на корректность входных данных   Проверка на корректность входных данных  
alsav22
5426 / 4821 / 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;
}
1
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;
И почему нужно использовать именно двухмерный массив, почему нельзя обойтись простым массивом?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 13:31 #21
Цитата Сообщение от The_bolT Посмотреть сообщение
И почему нужно использовать именно двухмерный массив, почему нельзя обойтись простым массивом?
Потому что номер делится на слова, которые по отдельности проверяются на правильность.

Цитата Сообщение от The_bolT Посмотреть сообщение
зачем там эта проверка?
Проверка на количество слов в номере (должно быть три). Проверка на количество символов в этих словах.

Добавлено через 2 минуты
Если результат нужно записать в поле класса (char phon), то, после успешного ввода, из массива последовательно извлечь три слова и записать через пробел (или как нужно).
1
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
10.03.2013, 13:34  [ТС] #22
alsav22, Спасибо, теперь понял что к чему!
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 13:38 #23
Самое рациональное - первый вариант. Остальное - извращения (это уже не C++, а что-то непонятное).
0
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
10.03.2013, 13:41  [ТС] #24
Я бы с радостью принял первый вариант, но нам нельзя использовать vector ни string, из STL ничего нельзя использовать!
0
alsav22
10.03.2013, 13:45     Проверка на корректность входных данных
  #25

Не по теме:

Я это понял.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2013, 13:45
Привет! Вот еще темы с ответами:

Проверка строки на корректность - C++
#include&lt;iostream&gt; #include&lt;cstring&gt; #include &lt;conio.h&gt; using namespace std; int main(){ char a; char a1; char a3; ...

Считывание, проверка на корректность - C++
Как считать uint64_t с клавиатуры, вывести на экран и проверить, что это именно неотрицательное целое число, а не double или char...

Проверка указателя на корректность - C++
Есть у меня указатель class* test = new class(); И он в цикле вечно используется. Так вот как сделать проверку , что этот указатель на...

Проверка на корректность логического выражения - C++
Добрый вечер. На входе имеем логического выражение которое может содержать : 1. константы : 0 или 1 2. скобки : () 3....


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

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

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