Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2012, 14:25   #1
ВладКлимов
 
Регистрация: 06.01.2012
Сообщений: 7
Вопрос Проблема с защитой от некоректного ввода данных.

Не могу придумать(даже найти) качественную защиту.Код на С++.
Суть:
1)Как ограничить строку вводу?(чтоб вводило например 5 до запятой, и еще 3 после, а дальше не давало вводить числа , при этом не заменяя прошлых)
2)Как допустить к вводу только : 0-9 , - e
ps у меня получилось только полное ограничение символов кроме цифр.
Вот код:

Код:
double** enter_data(int n, char* vvod){
	char number1[10];
	int z=0;
	double **arr = NULL;
	arr = new double*[n];
	for(int j = 0; j < n; j++)
		arr[j] = new double[n];
	printf("\n Нажмите 0 для случайного заполнения массива\n или любую другую клавнишу для ручного ввода: \n\n");
	*vvod = getch();
	if(*vvod == '0'){
		for(int i = 0; i < n; i++){
		    for(int j = 0; j < n; j++){
				arr[i][j] = rand()%2000-1000;
			}
		}
	}else{
		printf("Ввод по строкам: \n");
		printf("Введите значения элементов матрицы в диапазоне (от -1.7e308 до 1.7e308)" 
			   "\n!используя цифры!\n\n"); 
		
  for(int i = 0; i < n; i++){
			printf("Строка № %d: \n", i+1);
		    for(int j = 0; j < n; j++){
				printf("m[%d][%d] =", i, j);
				scanf("%s",number1);
                char * hlp=&(number1[0]);
                int result = strtol (number1, &hlp, 10);
                if(*hlp!=0) 
                {
                  printf("Вы ввели не допустимый символ!!!Будьте внимательней при вводе!!!\n",number1);
		          j--;
					continue;
                }else
                {
                  
                 
				double temp = atof(number1);
				if(temp >= -1.7e308 && temp <= 1.7e308)
					arr[i][j] = temp;
				else{
					printf("\nНеверный диапазон. Повторите ввод значения для элемента m[%d][%d]\n", i, j);
					j--;
					continue;
				}}
				}
			printf("\n\n");
		}
	}
	return arr;
}
Модератор: нормально код оформляй

Последний раз редактировалось MaTBeu; 06.01.2012 в 16:06.
ВладКлимов вне форума Ответить с цитированием
Старый 06.01.2012, 14:54   #2
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

ограничение колво ввода, попробуйте cin.getline()
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 06.01.2012, 14:56   #3
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Цитата:
2)Как допустить к вводу только : 0-9 , - e
Вам надо вводить только "0-9" и " е " ?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 06.01.2012, 15:02   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

С помощью getch() может быть?

И используйте тег [CODE] (значок # ) для сохранения форматирования и подсветки кода в сообщении. Кнопка Правка снизу справа.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.01.2012, 15:58   #5
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

Я бы советовал вам с этим не мучиться пока не подойдете к классам в них есть стандартные методы обработки исключений, довольно мощные
pinkiller вне форума Ответить с цитированием
Старый 06.01.2012, 16:07   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ТС, я думаю вам не стоит выпендриваться, а использовать форматированный ввод С++.
просто контролировать его корректность.
вам же нужны числа типа double, вот их и вводите через std::cin>>double.
просто обработайте некоректный ввод:
http://cplusplus.com/reference/iostr...perator%3E%3E/
раздел Return Value, там все сказано про контроль ошибок ввода.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.01.2012, 16:11   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Небольшой примерчик
http://programmersforum.ru/showthread.php?t=182567
MaTBeu вне форума Ответить с цитированием
Старый 06.01.2012, 23:38   #8
ВладКлимов
 
Регистрация: 06.01.2012
Сообщений: 7
Хорошо

Спасибо что откликнулись на мое сообщение, но проблема в том , что я использую Microsoft Visual Studio 2008 там у меня функции типа cin:: и т д не работают, если это возможно, можно как либо переделать код без них например с printf scanf ну такого рода функциями???Буду очень признателен, можно и через getch(), но как))???по поводу допустимых символов это от 0 до 9 , запятая, минус и e(английская , вроде как десятку означает или что-то вроде этого , но ее включить очень важно!), еще сразу вопрос , как можно будет проконтролировать чтоб пользователь не ввел число типо (-45e-,e-13) - ну вообщем чтоб из данных символов бред всякий не лепил, по поводу ограничения предложенная ф-я не работает((((т к из коллекции типа cin::, если это важно я создаю консольное приложение win32.Спасибо еще раз!


Если это поможет могу выложить программу полностью!
ВладКлимов вне форума Ответить с цитированием
Старый 06.01.2012, 23:45   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

все в студии есть, вы хидеры нужные то подключили?
(кстати у scanf тоже можно контролировать ввод)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.01.2012, 23:53   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ВладКлимов Посмотреть сообщение
но проблема в том , что я использую Microsoft Visual Studio 2008 там у меня функции типа cin:: и т д не работают

Ну вот я тоже сижу в 2008 студии, и у меня все объекты типа cin работают прекрасно.

Я просто делаю вот так:

#include <iostream> //теперь можно пользоваться std::cin, std::cin
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отмена ввода данных satka Microsoft Office Access 2 10.08.2011 00:00
Как сделать вывод данных после всего ввода данных. Donatello Общие вопросы C/C++ 6 16.01.2011 16:32
Дождаться ввода данных myxaxa41 Общие вопросы Delphi 1 16.12.2010 13:18
Сохранение данных с защитой от изменения marina15056 Помощь студентам 6 15.09.2010 08:38
Проблема с защитой данных/кодировкой goldsmir Общие вопросы C/C++ 0 26.01.2009 14:29