IPB
ЛогинПароль:

> Безопасный ввод данных с клавиатуры
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Доброе время суток.
Необходимо реализовать безопасный ввод данных в программе, на паскале.
Программе необходимо получить, допустим, 3 вещественных числа, которые вводятся с клавиатуры, но пользователь может ввести туда что-либо отличное от чисел. В таком случае необходимо, чтобы программа вывела сообщение об ошибке и попросила ввести данные заново.

Я уже реализовал это таким способом, но он меня не совсем устраивает:
Procedure Input_From_Keyboard(Var aa,bb,cc: real);
Var
Error: integer;
Begin
Repeat
ClrScr;
WriteLn('Введите a,b,c');
{$I-}
ReadLn(aa,bb,cc);
{$I+}
Error:=IOResult;
if Error<>0 then Error_Message;
Until Error=0;
End;

Работает отлично, если, скажем, введена такая последовательность "-4 5 %" (знак процента числом, как видно, не является), но если ввести "-7 5 gj hu hfh eio", то программа после первого вывода сообщения об ошибке и нажатия клавиши выведет его ещё раз. Если ввести много левых данных через пробел, то она много раз выведет ошибку, так что приходится это много раз жать на "любую клавишу".

Другой вариант
Procedure Input_From_Keyboard(Var aa,bb,cc: real);
Var
Error: integer;
aaa,bbb,ccc: char;
Begin
Repeat
ClrScr;
Error:=0;
WriteLn('Введите a,b,c');
ReadLn(aaa,bbb,ccc);
val(aaa,aa,Error); if Error=0 then begin
val(bbb,bb,Error);
if Error=0 then val(ccc,cc,Error);
end;
if Error<>0 then Error_Message;
Until Error=0;
End;

Тут всё ещё печальнее, переменной bbb присваивается значение пробела. Использовать методику введения дополнительной переменной и записывания в неё пробелов как-то не хочется.
На всякий случай
Procedure Error_Message;
Begin
WriteLn('Введены некорректные данные.');
WriteLn('Нажмите любую клавишу и повторите ввод.');
WriteLn('Для выхода из программы нажмите клавишу Esc.');
if readkey=#27 then halt;
End;

Для компиляции используется Free Pascal 2.6.0 x64 на ОС Linux Ubuntu 10.04.3 (если это имеет какое-то значение)

Сообщение отредактировано: Yegor -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


IUnknown, спасибо, помогло.
Но у этого метода есть один минус - программа становится уязвимой к введённым данным, получается, что если туда ввести чего-то очень много, то это что-то целиком запишется в оперативную память, что крайне нежелательно.
Знаю, что в паскаль можно вставить ассемблерные вставки, ассемблер, к сожалению, не знаю. Порылся в гугле, искал способы очистки буфера клавиатуры, всё, что находил по этому в итоге не компилировалось. Выводились ошибки, разные, то неизвестная ассемблерная команда, то ошибка синтаксиса.
Так что хотелось бы узнать, как очистить буфер клавиатуры с помощью ассемблерной вставки, раз, по словам IUnknown средствами паскаля это невозможно.

Сообщение отредактировано: Yegor -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.05.2024 15:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name