Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12

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

07.06.2012, 19:29. Показов 4338. Ответов 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 числа, тут тоже должно быть сообщение об ошибке.
Буду очень благодарен за помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2012, 19:29
Ответы с готовыми решениями:

Защита от некорректного ввода
Здравствуйте. 1 курс, полный нуб. Знаю только cin и cout, массивы. Пока все было нормально, но препод требует написать защиту от дурака,...

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

Защита от некорректного ввода
Приветствую, помогите, пожалуйста, реализовать защиту от некорректного ввода. Должны быть допустимы только числовые значения. double...

13
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2012, 20:06
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;
}
Миниатюры
Защита от некорректного ввода  
2
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2012, 20:09
Код плох тем что не фиксирует пустой ввод, т.е.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
!(cin>>val)
нам мешает именно это.
Поэтому на плюсах лучше всё делать через стрингпоток, сейчас выложу код.
А вот здесь 100% защищённый ввод на Си
https://www.cyberforum.ru/blogs/34326/blog279.html
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2012, 20:39
Как и обещал выкладываю код полнстью защищённого ввода на плюсах (теперь алгоритм умеет распознавать и пустой ввод)
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;
}
Миниатюры
Защита от некорректного ввода  
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2012, 20:52
Ну и чтобы как говориться "добить" прилагаю адаптированный код под 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;
}
Миниатюры
Защита от некорректного ввода  
2
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
07.06.2012, 20:54  [ТС]
Спасибо, буду разбираться
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2012, 20:57
shishkin, по поводу cin.get (не там ты парень ответы смотришь)
Тут норм описан данный метод
http://www.cplusplus.com/refer... tream/get/
0
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
09.06.2012, 04:02  [ТС]
shishkin, вот защищённый ввоод на плюсах
а как этот код использовать для массива? что бы проверялось не одно число, а несколько введенных
0
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
09.06.2012, 04:03  [ТС]
shishkin, вот защищённый ввоод на плюсах
а как этот код использовать для массива? что бы проверялось не одно число, а несколько введенных
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.06.2012, 11:36
shishkin, он и так считай под массив сделан - обрати внимание что цикл ввода бесконечен
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(true)
* * {
* * * * cout<<"Enter int : ";
* * * * if(!SaveInput(iVal))
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
09.06.2012, 11:43
-=ЮрА=-, а почему бы не заюзать cin.fail() / cin.good() ?
А хотя на разные типы это будет проблематично.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.06.2012, 12:09
Цитата Сообщение от The_Immortal Посмотреть сообщение
-=ЮрА=-, а почему бы не заюзать cin.fail() / cin.good() ?
А хотя на разные типы это будет проблематично.
потому что я реализовал шаблон-функцию
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
template <class T>
bool SaveInput(T &val)
{
которая подразумевает разные типы данных

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

Не по теме:

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

0
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 12
09.06.2012, 21:29  [ТС]
он и так считай под массив сделан - обрати внимание что цикл ввода бесконечен
как я понял, в данном случае массив придется вводить через Enter, ибо пробел распознается как символ и пишет Bad Input.
Скажем если ввести 3 4 5 - bad input.
3
4
5 - вот только так. А как сделать ввод через пробелы?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
10.06.2012, 10:41
Цитата Сообщение от shishkin Посмотреть сообщение
как сделать ввод через пробелы?
поставь к примеру в моём коде cin.get() == ' ', а вообще вводи строкой, запихивай в stringstream и делай вывод из него. Я привёл всё что необходимо для "безопасного ввода", вникаем в код и пишем ввод под чередование ходь под пробелы хоть под запятые хоть про что угодно...Писать за вас всё я не хочу, вы так ничего никогда знать не будете!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2012, 10:41
Помогаю со студенческими работами здесь

Защита от некорректного ввода
Здравствуйте. 1 курс, полный нуб. Знаю только cin и cout, массивы. Пока все было нормально, но помошник препода требует написать защиту от...

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

Защита от некорректного ввода
Помогите, пожалуйста, с защитой от некорректного ввода! Программа выполняет задания с помощью рекурсии. Хотел написать защиту на ввод...

Защита от некорректного ввода
Здравствуйте! Нужно осуществить контроль при заполнении матрицы, если введены не корректные данные, вывести сообщение, и переспросить...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru