Как сделать по возможности максимально универсальную защиту от дурака для ввода целых положительных чисел? - 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);
};

Объяснение кода листинга программы

  1. Ввод функции _cgetul() ожидает целочисленное значение, которое затем используется в качестве количества символов для ввода.
  2. Код сначала проверяет, является ли введенный символ , и если это так, переходит к операции отмены.
  3. Затем он проверяет, является ли введенный символ , и если это так, переходит к операции завершения ввода.
  4. Если введенный символ является , код переходит к операции удаления последнего введенного символа.
  5. Если введенный символ является числом от 0 до 9, код переходит к операции обработки этого числа.
  6. Если введенный символ не является числом от 0 до 9, код переходит к операции обработки этого символа.
  7. В случае ошибки или неправильного ввода, код возвращает значение -1.
  8. В основной функции main() выводится приглашение для ввода числа, затем вызывается функция _cgetul() с аргументом 7, и затем выводится введенное число.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы