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

Защита от некорректного ввода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
shishkin
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
07.06.2012, 19:29     Защита от некорректного ввода #1
Подскажите пожалуйста как доработать защиту от некорректного ввода:
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
163
164
165
166
167
168
169
170
171
172
173
// ConsoleApplication4.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <clocale>
 
using namespace std;
 
void input(float* mas, int n);
void input(double* mas, int n);
void output(float* mas, int n);
void output(double* mas, int n);
 
template<class my>
void MERGE(my A[], int a, int m, int b);
 
template<class my>
void MERGESort(my A[], int a, int b);
 
 
 
int main() {
char endkey;
setlocale(LC_ALL, "Russian_Russia.1251");
 
do{
int length=0;
short mastype=0;
 
while (length<1) {
cout<<"Введите длину массива: ";
cin>>length;
if (!cin.good()) 
{
cout<<endl<<"Вы ввели не число"<<endl;
cin.clear(); 
cin.ignore(255, '\n');
}} 
 
while (!((mastype==1)||(mastype==2))) {
cout<<"Выберите тип массива: 1-float 2-double"<<endl;
cin>>mastype;
if (!cin.good()) 
{ 
cout<<std::endl<< "Вы ввели не число" << std::endl;
cin.clear();
cin.ignore(255, '\n');
} 
}
 
 
if(mastype==1) {
float fa[500];
input(fa, length);
MERGESort(fa, 0, length-1);
output(fa, length);
} 
 
if(mastype==2) {
float da[500];
input(da, length);
MERGESort(da, 0, length-1);
output(da, length);
} 
 
cout<<endl<<"Для выхода из программы введите X(x), для повторения любой символ "<<endl;
cin>>endkey; 
 
} while (!(endkey=='X') && !(endkey=='x'));
 
 
return 0;
}
 
void input(float* mas, int n) {                                       //перегрузка функции ввода
bool error=0;
do {
error=0;
cout << "Введите "<<n<<" элемента(ов) массива float" << endl;
for (int i=0; i<n; i++){
cin>>mas[i];
if (!cin.good()) 
{
cout<<endl<<"Вы ввели не число" <<endl;
error=1;
cin.clear();
cin.ignore(255, '\n');
break;
}
}
} while (error);
}
 
void input(double* mas, int n) {                              //перегрузка функции ввода
bool error=0;
do {
error=0;
cout << "Введите "<<n<<" элемента(ов) массива double" << endl;
for (int i=0; i<n; i++){
cin>>mas[i];
if (!cin.good()) 
{
cout<<endl << "Вы ввели не число" <<endl;
error=1;
cin.clear();
cin.ignore(255, '\n');
break;
}
}
} while (error);
}
 
void output(float* mas, int n){                               //перегрузка функции вывода
cout<<"Результат: ";
for (int i=0;i<n;i++){
cout.width(5);
cout<<mas[i];
}
cout<<endl;
cin.get();
}
 
void output(double* mas, int n){                              //перегрузка функции вывода
cout<<"Результат: ";
for(int i=0;i<n;i++){
cout.width(5);
cout<<mas[i];
}
cout<<endl;
cin.get();
}
 
template<class my>                                                //шаблон сортировки
void MERGE(my A[], int a, int m, int b) {
 
  int pos1=a;
  int pos2=m+1;
  int pos3=0;  
 
  my *temp = new my[b-a+1];
 
  while (pos1 <= m && pos2 <= b) {
    if (A[pos1] < A[pos2])
      temp[pos3++] = A[pos1++];
    else
      temp[pos3++] = A[pos2++];
  }
 
  while (pos2 <= b)   
    temp[pos3++] = A[pos2++];
  while (pos1 <= m)  
    temp[pos3++] = A[pos1++];
 
  for (pos3 = 0; pos3 < b-a+1; pos3++)
    A[a+pos3] = temp[pos3];
 
  delete [] temp; 
}
 
 
template<class my>                                               //шаблон сортировки
void MERGESort(my A[], int a, int b) { 
  int m;                   
 
  if (a < b) {                
 
    m = (a + b)/2;
    MERGESort(A, a,m);       
    MERGESort(A, m+1, b);
    MERGE(A, a, m, b);   
  }
}
Интересует вот что: например при вводе длины массива 1, выбираем любой тип, далее вводим массив "123а123" без кавычек, должно быть сообщение об ошибке. При длине массива больше 1 работает нормально, за исключением пункта 2)
2) Вводим длину массива например 3, далее выбираем любой тип и вводим не 3, а 4 числа, тут тоже должно быть сообщение об ошибке.
Буду очень благодарен за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2012, 19:29     Защита от некорректного ввода
Посмотрите здесь:

C++ Защита ввода.
Защита от некорректного ввода C++
C++ Защита от некорректного ввода для действительных чисел
защита от ввода символов C++
Защита ввода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2012, 20:06     Защита от некорректного ввода #2
shishkin, вот защищённый ввоод на плюсах
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
#include <iostream>
using namespace std;
 
template <class T>
bool SaveInput(T &val)
{
    bool bCorrect = true;
    if(!(cin>>val) || cin.get() != '\n')
        bCorrect = false;
    if(!bCorrect)
    {
        cin.clear();//Сбрасываем флаг ошибки
        cin.sync();//Очищаем буффер ввода
    }
    return bCorrect;
}
 
int main()
{
    int iVal;
    double dVal;
    while(true)
    {
        cout<<"Enter int : ";
        if(!SaveInput(iVal))
            cout<<"Bad input\n";
        else
            cout<<"Your input : "<<iVal<<endl;
        cout<<"Enter double : ";
        if(!SaveInput(dVal))
            cout<<"Bad input\n";
        else
            cout<<"Your input : "<<dVal<<endl;
    }
    return 0;
}
Миниатюры
Защита от некорректного ввода  
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2012, 20:09     Защита от некорректного ввода #3
Код плох тем что не фиксирует пустой ввод, т.е.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
!(cin>>val)
нам мешает именно это.
Поэтому на плюсах лучше всё делать через стрингпоток, сейчас выложу код.
А вот здесь 100% защищённый ввод на Си
http://www.cyberforum.ru/blogs/34326/blog279.html
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2012, 20:39     Защита от некорректного ввода #4
Как и обещал выкладываю код полнстью защищённого ввода на плюсах (теперь алгоритм умеет распознавать и пустой ввод)
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
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
 
template <class T>
bool SaveInput(T &val)
{
    char chr;
    string input;
    stringstream ss;
    getline(cin,input);
    ss.str(input);
    bool bCorrect = true;
    if(input.length() == 0)
        bCorrect = false;
    else
    if((!(ss>>val)) || (ss>>chr))
        bCorrect = false;
    ss.clear();
    ss.sync();
    return bCorrect;
}
    
int main()
{
    int iVal;
    double dVal;
    while(true)
    {
        cout<<"Enter int : ";
        if(!SaveInput(iVal))
            cout<<"Bad or empty input\n";
        else
            cout<<"Your input : "<<iVal<<endl;
        cout<<"Enter double : ";
        if(!SaveInput(dVal))
            cout<<"Bad or empty input\n";
        else
            cout<<"Your input : "<<dVal<<endl;
    }
    return 0;
}
Миниатюры
Защита от некорректного ввода  
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2012, 20:52     Защита от некорректного ввода #5
Ну и чтобы как говориться "добить" прилагаю адаптированный код под VisualStudio 6.0 где
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
getline(cin,input);
немножко неправильно отрабатывает(надо жать ввод два раза подряд)
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
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
 
template <class T>
bool SaveInput(T &val)
{
    char chr;
    char input[1024] = {0};//Надеюсь вводить более 1023 символов за раз мы не будем;)
    stringstream ss;
    cin.getline(input,1023);
    ss.str(input);
    bool bCorrect = true;
    if(strlen(input) == 0)
        bCorrect = false;
    else
    if((!(ss>>val)) || (ss>>chr))
        bCorrect = false;
    ss.clear();
    ss.sync();
    return bCorrect;
}
    
int main()
{
    int iVal;
    double dVal;
    while(true)
    {
        cout<<"Enter int : ";
        if(!SaveInput(iVal))
            cout<<"Bad or empty input\n";
        else
            cout<<"Your input : "<<iVal<<endl;
        cout<<"Enter double : ";
        if(!SaveInput(dVal))
            cout<<"Bad or empty input\n";
        else
            cout<<"Your input : "<<dVal<<endl;
    }
    return 0;
}
Миниатюры
Защита от некорректного ввода  
shishkin
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
07.06.2012, 20:54  [ТС]     Защита от некорректного ввода #6
Спасибо, буду разбираться
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2012, 20:57     Защита от некорректного ввода #7
shishkin, по поводу cin.get (не там ты парень ответы смотришь)
Тут норм описан данный метод
http://www.cplusplus.com/reference/i...m/istream/get/
shishkin
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
09.06.2012, 04:02  [ТС]     Защита от некорректного ввода #8
shishkin, вот защищённый ввоод на плюсах
а как этот код использовать для массива? что бы проверялось не одно число, а несколько введенных
shishkin
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
09.06.2012, 04:03  [ТС]     Защита от некорректного ввода #9
shishkin, вот защищённый ввоод на плюсах
а как этот код использовать для массива? что бы проверялось не одно число, а несколько введенных
-=ЮрА=-
Заблокирован
Автор FAQ
09.06.2012, 11:36     Защита от некорректного ввода #10
shishkin, он и так считай под массив сделан - обрати внимание что цикл ввода бесконечен
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(true)
* * {
* * * * cout<<"Enter int : ";
* * * * if(!SaveInput(iVal))
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
09.06.2012, 11:43     Защита от некорректного ввода #11
-=ЮрА=-, а почему бы не заюзать cin.fail() / cin.good() ?
А хотя на разные типы это будет проблематично.
-=ЮрА=-
Заблокирован
Автор FAQ
09.06.2012, 12:09     Защита от некорректного ввода #12
Цитата Сообщение от The_Immortal Посмотреть сообщение
-=ЮрА=-, а почему бы не заюзать cin.fail() / cin.good() ?
А хотя на разные типы это будет проблематично.
потому что я реализовал шаблон-функцию
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
template <class T>
bool SaveInput(T &val)
{
которая подразумевает разные типы данных

Добавлено через 2 минуты

Не по теме:

The_Immortal, если есть свои наработки приводи их, мне будет интересно поглядеть на отличную от моей логику

shishkin
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
09.06.2012, 21:29  [ТС]     Защита от некорректного ввода #13
он и так считай под массив сделан - обрати внимание что цикл ввода бесконечен
как я понял, в данном случае массив придется вводить через Enter, ибо пробел распознается как символ и пишет Bad Input.
Скажем если ввести 3 4 5 - bad input.
3
4
5 - вот только так. А как сделать ввод через пробелы?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2012, 10:41     Защита от некорректного ввода
Еще ссылки по теме:

Защита от некорректного ввода C++
Защита от некорректного ввода double C++
Защита от некорректного ввода C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
10.06.2012, 10:41     Защита от некорректного ввода #14
Цитата Сообщение от shishkin Посмотреть сообщение
как сделать ввод через пробелы?
поставь к примеру в моём коде cin.get() == ' ', а вообще вводи строкой, запихивай в stringstream и делай вывод из него. Я привёл всё что необходимо для "безопасного ввода", вникаем в код и пишем ввод под чередование ходь под пробелы хоть под запятые хоть про что угодно...Писать за вас всё я не хочу, вы так ничего никогда знать не будете!
Yandex
Объявления
10.06.2012, 10:41     Защита от некорректного ввода
Ответ Создать тему
Опции темы

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