M@gelearn Ответов: 2

Фильтр ввода только для чисел в C


Как получить ввод от пользователя, только цифры?
это мой код.:

#include <windows.h>
#include <stdio.h>

int a;
int b;
int options;

void premenu()
{
    printf("\n\t\t* Operatori Unari - Increment si Decrement *\n\n");
    printf("\n\tIntroduceti a = ");
    scanf("%d", &a);
}
void menu()
{
    printf("\n\tAlege una din optiunile de mai jos:\n"
           "\n 1. Post Incrementare (b = a++)"
           "\n 2. Pre Incrementare (b = ++a)"
           "\n 3. Post Decrementare (b = a--)"
           "\n 4. Pre Decrementare (b = --a)"
           "\n 5. Iesire Program"
           "\n\n Selectati: ");
    scanf("%d", &options);
}
int main()
{
    premenu();
    menu();
    int i;
    for(i = 0; i < options;)
    {
        if(options == 1)
        {
            b = a++;
            printf("\n a = %d si b = %d\n", a, b);
            Sleep(2500);
            system("cls");
            premenu();
            menu();
        }
        else if(options == 2)
        {
            b = ++a;
            printf("\n a = %d si b = %d\n", a, b);
            Sleep(2500);
            system("cls");
            premenu();
            menu();
        }
        else if(options == 3)
        {
            b = a--;
            printf("\n a = %d si b = %d\n", a, b);
            Sleep(2500);
            system("cls");
            premenu();
            menu();
        }
        else if(options == 4)
        {
            b = --a;
            printf("\n a = %d si b = %d\n", a, b);
            Sleep(2500);
            system("cls");
            premenu();
            menu();
        }
        else if(options == 5)
        {
            Sleep(1000);
            system("cls");
            printf("\n\n\tTerminare Program ! Apasati orice tasta pentru a inchide.\n");
            Sleep(3000);
            system("cls");
            break;
        }
        else
        {
            printf("\n Nu exista aceasta optiune !\n");
            Sleep(1000);
            printf("\n Selectati 1, 2, 3, 4 sau 5");
            Sleep(2500);
            system("cls");
            printf("\n\t\t* Operatori Unari - Increment si Decrement *\n\n");
            printf("\n\tIntroduceti a = %d\n", a);
            menu();
        }
    }
    return 0;
}


Что я уже пробовал:

Извините за язык в коде не английский Тхо.. :\

Richard MacCutchan

В чем же проблема? Если пользователь вводит любой параметр, отличный от 1,2,3,4 или 5, вы публикуете сообщение об ошибке. Вы можете добавить некоторый код в premenu, чтобы проверить результат вызова функции scanf, и проверить, что значение находится в некотором диапазоне.

M@gelearn

Да, да .. проблема не в том, что с опцией 1, 2, 3, 4 или 5 я обращаюсь к пременю, когда пользователь впервые вводит номер. Если пользователь наберет буквенное " А " или "в", или любой другой знак, например " \ "или"]", или любой другой знак, программа сломается. Вот в чем суть моего вопроса. Ofc. если я разрешу пременю, я могу добавить тот же код, чтобы избежать типа пользователя, отличного от 1, 2, 3, 4 или 5 .

Richard MacCutchan

Вот что я имел в виду. Ваша функция premenu использует scanf для получения значения, но вы не проверяете результат. Поэтому начните с установки некоторого значения a (например, минимального значения для int: -2147483648) и проверьте результат после scanf, чтобы убедиться, что он действителен.

2 Ответов

Рейтинг:
5

M@gelearn

Наконец-то я покончил с этой неразберихой. В пременю я добавляю этот код:

int temp, status;

void premenu()
{

    printf("\n\t\t* Operatori Unari - Increment si Decrement *\n\n");
    printf("\n\tIntroduceti a = ");
    status = scanf("%d", &a);
    while(status != 1)
    {
        while((temp = getchar()) != EOF && temp != '\n')
        {
            printf("\na nu este valid...Te rog sa introduci un numar !");
            Sleep(1500);
            system("cls");
            printf("\n\t\t* Operatori Unari - Increment si Decrement *\n\n");
            printf("\n\tIntroduceti a = ");
            status = scanf("%d", &a);
        }
    }
}


И это прекрасно работает.. либо если вы наберете символ любого вздоха.. Я вывешиваю сообщение об ошибке и заставляю пользователя ввести номер.
Я еще не проверял ваше решение OriginalGriff, но думаю, что оно тоже работает..
Еще раз всем спасибо !!


Рейтинг:
2

OriginalGriff

Вместо того чтобы читать входные данные как число, я бы предложил читать их как строку и либо преобразовывать их в число, либо (лучше) обрабатывать первый символ входной строки.
Если бы вы сделали это с помощью констант #define, то код также был бы более четким:

#define OP_PREINC '2'
...
        else if(options == OP_PREINC)
        {
Таким образом, если я наберу "WTF?", то ваше приложение сможет справиться с этим более изящно, чем сбой.

Я бы также вернул значение опции из меню или функции premenu вместо того, чтобы использовать глобальную переменную для переноса значения:
do
    {
        switch (menu())
        {
           case OP_PREINC:
           { 
           ...