Как сделать по возможности максимально универсальную защиту от дурака для ввода целых положительных чисел? - 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, и затем выводится введенное число.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д