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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
04.01.2013, 21:51     Проверка введенных данных cin на корректность #1
Вот кусок кода :
C++
1
2
3
4
5
6
7
8
input1 : cout<<"Введите количество животных которые когда либо жили у вас : ";
 
cin>>amountPats;
if (!cin)
{
    cout<<"Введите число!\n";
    goto input1;
}
Вводим некоректный cin (в данном случае к примеру 'q'), затем программа видит эту ошибку и открывает if, но вместо вывести сообщение и перейти к метке, выводиться в цикле сообщени : "Введите число!". Почему так?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
04.01.2013, 21:55     Проверка введенных данных cin на корректность #2
Видимо, предполагалось
C++
1
if (!(cin >> whatever))
Но за goto... В общем, не продолжаю.
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
04.01.2013, 22:01  [ТС]     Проверка введенных данных cin на корректность #3
Тоже не люблю goto...но если оно простое то наверное лутчего его чем цикл while, а в не еще и if-else.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
04.01.2013, 22:02     Проверка введенных данных cin на корректность #4
Не используйте goto. Вообще никогда.
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
04.01.2013, 22:08  [ТС]     Проверка введенных данных cin на корректность #5
Поменял if (!cin) на if (!(cin>>ammountsPat), теперь зацикливаеться строка номер 2.) (пока еще с goto, перепешу когда проверка заработает)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
04.01.2013, 22:12     Проверка введенных данных cin на корректность #6
А, забыл совсем. В общем, в одной из моих программок взаимодействие с пользователем было реализовано таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
size_t index;
while (1)
{
    menu.Show();
    std::cout << "> ";
 
    if (std::cin >> index)
    {
        menu.Select(index);
    }
    else
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    std::cout << std::endl;
}
Суть в строках 13-14.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.01.2013, 22:16     Проверка введенных данных cin на корректность #7
0x10, ну а если такая ситуация:
C++
1
2
3
4
5
6
7
for (...){
for (...){
while (...){
if (...) { goto stop; }
...
}}}
stop:...
как тут без goto обойтись? Неужели с брейками мучиться?

Добавлено через 2 минуты
А вообще я тоже недолюбливаю goto. Получается не код, а каша с спагетти...
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
04.01.2013, 22:17     Проверка введенных данных cin на корректность #8
coloc, в этом случае у нас уже совершенно другие проблемы. Мы получаем слишком сложную структуру кода, глубокую вложенность. От такого надо банально стараться уходить.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
04.01.2013, 22:36     Проверка введенных данных cin на корректность #9
Цитата Сообщение от coloc Посмотреть сообщение
как тут без goto обойтись? Неужели с брейками мучиться?
не один раз обсуждалось
все циклы загнать в функцию и return
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int fnc()
{
for (...){
for (...){
while (...){
if (...) { return 0;}
...
}}}
return 1;
}
int main()
{
fnc();
// здесь все что было после метки
}

Цитата Сообщение от XpertVision Посмотреть сообщение
Тоже не люблю goto...но если оно простое то наверное лутчего его чем цикл while, а в не еще и if-else.
давай посмотрим


C++
1
2
3
4
5
6
7
8
cout<<"Введите количество животных которые когда либо жили у вас : ";
cin>>amountPats;
while(!amountPats)
{
  cout<<"Введите число!\n";
 cout<<"Введите количество животных которые когда либо жили у вас : ";
cin>>amountPats;
}
по моему гораздо понятней ( причем я оставил твой код просто переписал с while)
я бы написал так
C++
1
2
3
4
5
6
do
{
cout<<"Введите количество животных которые когда либо жили у вас : ";
 cout<<"Введите число!\n";
cin>>amountPats;
 }while(!amountPats);
Добавлено через 2 минуты
хотя здесь есть маленькая ошибка
если никто не жил вводим 0 и зацикливаемся
надо вводить строку и анализировать её

Добавлено через 4 минуты
я что то подзабыл что будет если мы введем в числовую перемененную символ , и найти нигде не могу
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
04.01.2013, 22:44  [ТС]     Проверка введенных данных cin на корректность #10
Во всех предложеных вариантах одни и теже глюки, наверное покажу весь код, может так нагляднее будет :
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#include "classPat.h"
#include <stdlib.h>
#include <fstream>
 
using std::cin;
using std::cout;
using std::string;
using std::ofstream;
using std::ifstream;
 
int menu();
int firstMenu();
 
int main ()
{  
    setlocale (LC_ALL, "Russian");
    
    bool exit;
    exit=false;
    string ownerName;
    string patName;
    int amountPats;
    
    Pat *objPat;
    
    for ( ; ; )
    {
        int choice=firstMenu();
        switch(choice)
        {
            case 1 :
                {
                    system("cls");
                    cout<<"Введите ваше имя : ";
                    cin.ignore();
                    getline (cin, ownerName);
                    cout<<"Введите количество животных которые когда либо жили у вас : ";
                    cin>>amountPats;
            
                    objPat=new Pat[amountPats];
                    
                    for (int i=0; i<amountPats; i++)
                    {
                        cout<<"Введите имя "<<i+1<<"-го животного : ";
                        cin.ignore();
                        getline (cin, patName);
                        objPat[i].SetName(patName);
                        cout<<"Введите возраст "<<i+1<<"-го животного : ";
                        float patAge;
                        cin>>patAge;
                        objPat[i].SetAge(patAge);
                    }
                    system("cls");
                    cout<<"\n-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                    cout<<"\nВаше имя : "<<ownerName<<"\n";
                    cout<<"Количество ваших питомцев : "<<amountPats<<"\n";
                    cout<<"-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                    for (int i=0; i<amountPats; i++)
                    {
                        cout<<"\nДанные "<<i+1<<"-го питомца :\n";
                        cout<<"Имя : "<<objPat[i].GetName()<<"\n";
                        cout<<"Возраст (полных лет) : "<<objPat[i].GetAge()<<"\n";
                        cout<<"----------------------------------------------\n";
                    }
                    system("pause");
                    system("cls");
                    
                    for ( ; ; )
                    {
                        int choiceTwo=menu();
                        switch (choiceTwo)
                        {
                            case 1 :
                                {
                                    delete [] objPat;
                                    system("cls");
                                    cout<<"Введите ваше имя : ";
                                    cin.ignore();
                                    getline (cin, ownerName);
                                    cout<<"Введите количество животных которые когда либо жили у вас : ";
                                    cin>>amountPats;
            
                                    objPat=new Pat[amountPats];
                    
                                    for (int i=0; i<amountPats; i++)
                                    {
                                        cout<<"Введите имя "<<i+1<<"-го животного : ";
                                        cin.ignore();
                                        getline (cin, patName);
                                        objPat[i].SetName(patName);
                                        cout<<"Введите возраст "<<i+1<<"-го животного : ";
                                        float patAge;
                                        cin>>patAge;
                                        objPat[i].SetAge(patAge);
                                    }
                                    system("cls");
                                    cout<<"\n-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                                    cout<<"\nВаше имя : "<<ownerName<<"\n";
                                    cout<<"Количество ваших питомцев : "<<amountPats<<"\n";
                                    cout<<"-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                                    for (int i=0; i<amountPats; i++)
                                    {
                                        cout<<"\nДанные "<<i+1<<"-го питомца :\n";
                                        cout<<"Имя : "<<objPat[i].GetName()<<"\n";
                                        cout<<"Возраст (полных лет) : "<<objPat[i].GetAge()<<"\n";
                                        cout<<"----------------------------------------------\n";
                                    }
                                    system("pause");
                                    system("cls");
                                    break;
                                }
                            case 2 :
                                {
                                    system("cls");
                                    ofstream writeFile;
                                    writeFile.open ("proba.txt");
                                    writeFile<<"-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                                    writeFile<<"\nВаше имя : "<<ownerName<<"\n";
                                    writeFile<<"Количество ваших питомцев : "<<amountPats<<"\n";
                                    writeFile<<"-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                                    for (int i=0; i<amountPats; i++)
                                    {
                                        writeFile<<"\nДанные "<<i+1<<"-го питомца :\n";
                                        writeFile<<"Имя : "<<objPat[i].GetName()<<"\n";
                                        writeFile<<"Возраст (полных лет) : "<<objPat[i].GetAge()<<"\n";
                                        writeFile<<"----------------------------------------------";
                                    }
                                    writeFile.close();
                                    cout<<"Файл успешно записан!\n";
                                    system("pause");
                                    system("cls");
                                    break;
                                }
                            case 3 :
                                {
                                    system("cls");
                                    ifstream is("proba.txt");
                                    if (!is)
                                    {
                                        cout<<"Ошибка! Файл не существует!\n";
                                    }
                                    else
                                    {
                                        string fileContain;
                                        while (!is.eof())
                                        {
                                            getline (is, fileContain, '\n');
                                            cout<<fileContain<<"\n";
                                        }
                                    }
                                    system("pause");
                                    system("cls");
                                    break;
                                }
                            case 4 :
                                {
                                    exit=true;
                                    break;
                                }
                            default :
                                {
                                    system("cls");
                                    cout<<"Введите правильный номер нужного пункта!\n";
                                    system("pause");
                                    system("cls");
                                    break;
                                }
                        }
                        if (exit==true)
                        {
                            break;
                        }
                    }
                    
                    break;
                }
            case 2 :
                {
                    system("cls");
                    ifstream is("proba.txt");
                    if (!is)
                    {
                        cout<<"Ошибка! Файл не существует!\n";
                    }
                    else
                    {
                        string fileContain;
                        while (!is.eof())
                        {
                            getline (is, fileContain, '\n');
                            cout<<fileContain<<"\n";
                        }
                    }
                    system("pause");
                    system("cls");
                    break;
                }
            case 3 :
                {
                    exit=true;
                    break;
                }
            default :
                {
                    system("cls");
                    cout<<"Введите правильный номер нужного пункта!\n";
                    system("pause");
                    system("cls");
                    break;
                }   
        }
        if (exit==true)
        {
            break;
        }
    }
    return 0;
}
 
int menu()
{
    int choice;
    cout<<"                     МЕНЮ                     \n";
    cout<<"----------------------------------------------\n";
    cout<<"1. Начать заполнение таблици\n";
    cout<<"2. Записать таблицу в файл\n";
    cout<<"3. Считать таблицу из файла\n";
    cout<<"4. Выход\n";
    cout<<"----------------------------------------------\n";
    cout<<"Введите номер нужного пункта : ";
    cin>>choice;
    return choice;
}
 
int firstMenu()
{
    int choice;
    cout<<"                     МЕНЮ                     \n";
    cout<<"----------------------------------------------\n";
    cout<<"1. Начать заполнение таблици\n";
    cout<<"2. Считать таблицу из файла\n";
    cout<<"3. Выход\n";
    cout<<"----------------------------------------------\n";
    cout<<"Введите номер нужного пункта : ";
    cin>>choice;
    return choice;
}
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
04.01.2013, 23:05     Проверка введенных данных cin на корректность #11
Цитата Сообщение от XpertVision Посмотреть сообщение
using std::cin;
using std::cout;
using std::string;
using std::ofstream;
using std::ifstream;
не знаю что ты хотел
но обычно пишут
C++
1
using namespace std;
использовать пространство имен std
Цитата Сообщение от XpertVision Посмотреть сообщение
bool exit;
видишь exit синеньким горит? это значит служебное слово
поменяй имя
например
C++
1
bool my_exit=false;
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
04.01.2013, 23:26  [ТС]     Проверка введенных данных cin на корректность #12
VS 2012 не подсвечивает, но поправлю, спасибо. namespace std знаю, но читал что проблемы могут быть в больших приложниях, потому приучаю себя по одной подключать..по мере использования.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
04.01.2013, 23:35     Проверка введенных данных cin на корректность #13
Цитата Сообщение от XpertVision Посмотреть сообщение
но читал что проблемы могут быть в больших приложниях,
это будет если у тебя два разных пространства будут иметь одну и туже функцию
например включишь так
C++
1
2
using namespace std;
using namespace  Mystd;
и в обоих допустим есть
C++
1
cin
произойдет конфликт имен
но я честно говоря с этим не сталкивался да и всегда можно написать
C++
1
2
3
using namespace std;
cin  // из std
Mystd::cin  // из Mystd;
да и включать выключать можно по мере использования
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2013, 20:05     Проверка введенных данных cin на корректность
Еще ссылки по теме:

Проверка на корректность введенных данных C++
Задана дата в пределах года (число – от 1 до 31, месяц – от 1 до 12). Проверить корректность введенных данных C++
Cin: проверка ввода данных C++

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

Или воспользуйтесь поиском по форуму:
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
06.01.2013, 20:05  [ТС]     Проверка введенных данных cin на корректность #14
Все решилось вот так :
C++
1
2
3
4
5
6
while (!(cin>>amountPats))
{
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cout<<"Не верный ввод!!! Введите число : ";
}
Единственное что вариант "4ghy" проходит, тоесть если первая цифра..цифру записывает, а следующас не цифровая переменная пустая...пустота в нее записываеться. (это пока побороть знаний не хватает) И есть вопрос, что делает эта строка, там где нашол ее, значение не объяснили :
C++
1
cin.ignore(cin.rdbuf()->in_avail());
Yandex
Объявления
06.01.2013, 20:05     Проверка введенных данных cin на корректность
Ответ Создать тему
Опции темы

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