Как сделать по возможности максимально универсальную защиту от дурака для ввода целых положительных чисел? - C (СИ)
Формулировка задачи:
Добрый день!
Хотел бы спросить, как сделать по возможности максимально универсальную защиту от дурака для ввода целых положительных чисел?
Я имею ввиду прежде всего защиту от ввода текста и дробей - с отрицательными всё очевидно.
Разобрался, не потребовался ответ.
if (((scanf("%d", &number))!=0) && (number>0)) { далее передача параметров в функцию и т.д. }Решение задачи: «Как сделать по возможности максимально универсальную защиту от дурака для ввода целых положительных чисел?»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
unsigned long _cgetul(int chrs)
{
const int ten = 10;
__asm{
xor edx, edx
mov ecx, [chrs] ; кол-во знаков
next: push ecx
push edx
call getch
pop edx
pop ecx
or al,al
jz next
cmp al, 1Bh ; <ESC>?
jz cancel
cmp al, 0Dh ; <Enter>?
jz done
cmp al, 08h ; <BkSp>?
jnz isdig
; отработка <BkSp>
rubout: cmp [chrs],ecx ; первый символ?
jz next ; да
@r_: mov eax, edx
xor edx, edx
idiv dword ptr ten ; делим наше вводимое число на 10.
mov edx,eax
inc ecx
; курсор взад на 1 позицию - возврат на символ-пробел-возврат на символ
@bs:
push ecx
push edx
pushd 8
call putch ; Backspace
pushd 0x20
call putch ; Space
add esp, 4
call putch ; Backspace
add esp, 4
pop edx
pop ecx
jmp next
isdig: cmp al, 30h
jb next
cmp al, 39h
ja next
movzx eax,al ; убираем из eax лишнее
lea edx,[edx*4+edx] ; EDX = EDX * 5
lea edx,[edx*2+eax-48] ; EDX = EDX * 2 + символ из AL - '0'
push ecx
push edx
push eax
call putch
add esp, 4
pop edx
pop ecx
dec ecx
jnz next
done: mov eax, edx ;
jmp ex
cancel: xor eax, eax
dec eax ; EAX = -1
ex: ;
};
// Здесь ожидается "Missing return value for function '_cgetul'"
};
void main()
{
unsigned long jx;
cputs("Enter number:");
jx =_cgetul(7);
cprintf("number is %d",jx);
};
Объяснение кода листинга программы
- Ввод функции _cgetul() ожидает целочисленное значение, которое затем используется в качестве количества символов для ввода.
- Код сначала проверяет, является ли введенный символ
, и если это так, переходит к операции отмены. - Затем он проверяет, является ли введенный символ
, и если это так, переходит к операции завершения ввода. - Если введенный символ является
, код переходит к операции удаления последнего введенного символа. - Если введенный символ является числом от 0 до 9, код переходит к операции обработки этого числа.
- Если введенный символ не является числом от 0 до 9, код переходит к операции обработки этого символа.
- В случае ошибки или неправильного ввода, код возвращает значение -1.
- В основной функции main() выводится приглашение для ввода числа, затем вызывается функция _cgetul() с аргументом 7, и затем выводится введенное число.