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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
shishkin
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
#1

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

07.06.2012, 19:29. Просмотров 1741. Ответов 13
Метки нет (Все метки)

Подскажите пожалуйста как доработать защиту от некорректного ввода:
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++
Приветствую, помогите, пожалуйста, реализовать защиту от некорректного ввода. Должны быть допустимы только числовые значения. double...

Защита от некорректного ввода - C++
Будьте добры, помогите написать защиту от дурака на ввод массива элементы которого тип float Буду очень благодарен.

Защита от некорректного ввода double - C++
Прошу помощи с защитой от некорректного ввода. Сам студент 1 курса - на лекциях ничего толком не объясняли - просто дали задание и довольно...

Защита от некорректного ввода для действительных чисел - C++
Программа полностью рабочая, только нужно написать защиту от некорректного ввода, и не знаю как это сделать #include &lt;stdafx.h&gt; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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
1551 / 487 / 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++
void task_1(int **A, int M, int N) { int i=0, sum=0; //1.) сумму элементов в тех строках, которые содержат хотя бы один отрицательный...

Защита ввода - C++
Подскажите как осуществить защиту от неправильного ввода то есть если переменная типа int как сделать так что бы пользователь не мог ...

Защита ввода. - C++
Как защитить размер матрицы от набора букв или символов?

Защита от ввода букв - C++
Нужно в программу вставить защиту от ввода букв. Что то у меня не получается. (В программе вводится только цифра) #include...

Защита от ввода символов - C++
есть код в котором я ввожу цифры нужно сделать что бы через консоль я не могу вводить больше ничего другого кроме цифр возможно такое...


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

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

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