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

Защита от ввода некорректных данных в консольной программе - C++

Восстановить пароль Регистрация
 
SuperMario
 Аватар для SuperMario
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 3
03.01.2013, 09:57     Защита от ввода некорректных данных в консольной программе #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
#include "stdafx.h"
#include <iostream>
#include <cstdlib> 
#include <conio.h>
#include <cmath>
 
using namespace std;
 
float slojenie (float f_n1, float f_n2, float f_n3) {
    return f_n1 + f_n2 + f_n3;
}
 
float ymnojenie (float f_n1, float f_n2, float f_n3) {
    return f_n1 * f_n2 * f_n3;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
        char  num[2]
        float n1, n2, n3;
        
    while (1) {
            cout<<"              ::Меню программы:: "<<endl<<endl;
            cout<<"          '1'   - Сложение трех чисел."<<endl;
            cout<<"          '2'   - Умножение трех чисел чисел."<<endl;
            cout<<"          '3'   - Выйти из программы."<<endl<<endl;
            cin>>num;
            cout<<endl;
                             
          if (num[0] == '1') {
            cout << "Для сложения введите три числа: "<<endl;
            cin >> n1 >> n2 >> n3;
            cout<<endl;
            cout << "Результат сложения трёх чисел : "<<slojenie(n1, n2, n3)<<endl<<endl;
          }
          else if (num[0] == '2') {
            cout << "Для умножения введите три числа: "<<endl;
            cin >> n1 >> n2 >> n3;
            cout<<endl;
            cout << "Результат умножения трёх чисел : "<<ymnojenie(n1, n2, n3)<<endl<<endl;
          }
          else if (num[0] == '3') {
              return 0;
          }
          else if (num[0] > '3'  || num[0] < '1') { 
              cout<<"Вы ввели несуществующий пункт меню."<<endl; 
          }
          else {    
              cout<<"Вы ввели несуществующий пункт меню."<<endl;
          }
          
    }   
 
    return 0;
 
}
Написал эту примитивную менюшку, вроде бы все хорошо: программа обрабатывает следующие попытки ввода некорректных данных:
- если при выборе пункта меню мы вводим в консоль следующее: #$@$rewr$6(*%9 , то программа реагирует правильно и выдаёт сообщение "Вы ввели несуществующий пункт меню."
- если при выборе пункта меню мы вводим в консоль следующее: asdassdsdasd+пробелы с клавиатуры, то программа реагирует правильно и выдаёт сообщение "Вы ввели несуществующий пункт меню."

Проблема заключается в том, что если в консоль при выборе пункта меню ввести следующее:
- q323 334 - программа выдает окно ошибки: Run-Time Check Failure #2 - Stack around the variable 'num' was corrupted.
- q12 123 - программа выдаёт сообщение "Вы ввели несуществующий пункт меню." , но тем не менее после этого самопроизвольно вызывает 2-ой пункт меню "Для умножения введите три числа:"., далее если ввести вместо этих трех чисел например: qwe eqw eqwe - то программу зацикливает.
- er weuir r wer werwe r - при таком вводе при выборе пункта, прога дублирует менюшку ровно 6 раз (равное количеству пробелов между введенной кадаброй).

Помогите пожалуйста доделать мне эту прожку, чтобы она корректно отсеивала намеренно неправильно введенные данные как при выборе пункта меню, так и при вводе данных для сложения и умножения и выхода из программы. Просто уже многие варианты перепробовал - не получается. Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2013, 09:57     Защита от ввода некорректных данных в консольной программе
Посмотрите здесь:

C++ Создать процесс в консольной программе
C++ Защита ввода.
C++ Обработка исключений при вводе некорректных данных
C++ Зацикливание программы при вводе некорректных данных
Обработку исключений при вводе некорректных данных C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_andrew_
22 / 22 / 3
Регистрация: 14.11.2012
Сообщений: 64
03.01.2013, 10:08     Защита от ввода некорректных данных в консольной программе #2
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
#include <iostream>
#include <cstdlib> 
#include <conio.h>
#include <cmath>
 
using namespace std;
 
float slojenie (float f_n1, float f_n2, float f_n3) {
    return f_n1 + f_n2 + f_n3;
}
 
float ymnojenie (float f_n1, float f_n2, float f_n3) {
    return f_n1 * f_n2 * f_n3;
}
 
 
int main()
{
        char  num[2];
        float n1, n2, n3;
        
 
            cout<<"              ::Меню программы:: "<<endl<<endl;
            cout<<"          '1'   - Сложение трех чисел."<<endl;
            cout<<"          '2'   - Умножение трех чисел чисел."<<endl;
            cout<<"          '3'   - Выйти из программы."<<endl<<endl;
            cin>>num;
            cout<<endl;
                             
         switch(num[0]) {
            case '1': cout<<"Для сложения введите три числа: "<<endl;
            cin >> n1 >> n2 >> n3;
            cout<<endl;
            cout << "Результат сложения трёх чисел : "<<slojenie(n1, n2, n3)<<endl<<endl;
          break;
           case '2':            cout << "Для умножения введите три числа: "<<endl;
            cin >> n1 >> n2 >> n3;
            cout<<endl;
            cout << "Результат умножения трёх чисел : "<<ymnojenie(n1, n2, n3)<<endl<<endl;
         case '3':
         break;
          
          default:    cout<<"Вы ввели несуществующий пункт меню."<<endl;
          }
 getch();
    return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
03.01.2013, 10:11     Защита от ввода некорректных данных в консольной программе #3
Пробуйте:
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
        char  num;
        float n1, n2, n3;
        
    while (1) {
            cout<<"              ::Меню программы:: "<<endl<<endl;
            cout<<"          '1'   - Сложение трех чисел."<<endl;
            cout<<"          '2'   - Умножение трех чисел чисел."<<endl;
            cout<<"          '3'   - Выйти из программы."<<endl<<endl;
            num=std::cin.get();
            cout<<endl;
                             
          if (num == '1') {
            cout << "Для сложения введите три числа: "<<endl;
            cin >> n1 >> n2 >> n3;
            cout<<endl;
            cout << "Результат сложения трёх чисел : "<<slojenie(n1, n2, n3)<<endl<<endl;
          }
          else if (num == '2') {
            cout << "Для умножения введите три числа: "<<endl;
            cin >> n1 >> n2 >> n3;
            cout<<endl;
            cout << "Результат умножения трёх чисел : "<<ymnojenie(n1, n2, n3)<<endl<<endl;
          }
          else if (num == '3') {
              return 0;
          }
          else if (num > '3'  || num < '1') { 
              cout<<"Вы ввели несуществующий пункт меню."<<endl; 
          }
          else {    
              cout<<"Вы ввели несуществующий пункт меню."<<endl;
                  std::cin.clear();while(std::cin.get()!='\n');
          }
          
    }   
 
    return 0;
0x10
03.01.2013, 11:48     Защита от ввода некорректных данных в консольной программе
  #4

Не по теме:

Столько было программ с текстовым меню на форуме - уже давно написали бы небольшой класс, который умеет формировать меню и копипастили бы его использование...

Yandex
Объявления
03.01.2013, 11:48     Защита от ввода некорректных данных в консольной программе
Ответ Создать тему
Опции темы

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