Проверка ввода для чисел (еще повторить) - C - PullRequest
0 голосов
/ 07 декабря 2018

У меня проблема.У меня есть рабочий код, но мне нужно его переделать.

    #include <stdio.h>
    #include <stdlib.h>

int num_input(char *vyzva)
{
    int input;
    while (scanf("%d", &input) != 1) {
        fflush(stdin);
        printf("\nIt is not a number! Please repeat.\n\n");
        printf("%s", vyzva);
    }
    fflush(stdin);
    return input;
}


int main (void){
 int cislice;


 printf("Insert a number: ");

 cislice = num_input("Insert a number:");

 printf("Number is: %d", cislice);

return 0;
}

Основная цель переработанного кода - проверить, является ли пользователь ipnut только числом (таким же, как рабочий код).Мне нужно получить этот ввод с помощью функции fgets, а затем преобразовать строку в число.

Для этого теста я не могу использовать scanf.Мне сказали, что функция strtol работает для этого, но я понятия не имею, как.Может кто-нибудь показать мне, как использовать strtol для проверки, является ли ввод цифрой или несколькими буквами?

Это домашнее задание.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Из руководства по strtol:

long int strtol (const char * nptr, char ** endptr, int base);
...
Если endptr не равен NULL, strtol () сохраняет адрес первого недопустимого символа
в * endptr.Если цифр не было вообще, strtol () сохраняет
исходное значение nptr в * endptr (и возвращает 0).В частности,
, если * nptr не равно '\ 0', но ** endptr равно '\ 0' при возврате, вся строка
действительна.

Это означает, что в вашем коде вам нужно использовать указатель 'endptr', чтобы проверить, соответствует ли первый недопустимый символ первой не цифре после числа.Вы также используете тот факт, что вы можете вычесть два указателя, чтобы получить смещение

#define BUFF 20

int num_input()
{
    long int res;

    char buffer[BUFF];
    fgets( buffer, BUFF, stdin);
    char * endptr = NULL;
    res = strtol( buffer, &endptr, 10);

    int len = strlen( buffer);

    if( len-1 > endptr - buffer)
    {
        //Handle wrong result
    }

    return res;
}

В основном, это то, что это делает, проверяет, больше ли входное значение чтения, чем количество цифр, преобразованных strtol.
Если это так, вы обрабатываете свое исключение.

PS: проверка не будет выполнена, если после номера есть пробелы!

0 голосов
/ 07 декабря 2018

Поскольку это домашнее задание, ваш учитель, вероятно, не хочет, чтобы вы использовали strtol.

Это классическое упражнение по пониманию того, как символы представлены в компьютере..

Что обычно ожидается в таком назначении, так это то, что вы запускаете массив символов gets, возвращаемый в цикле, и проверяете, что содержится в каждой ячейке.Если вы найдете ячейку, содержащую символ, который не является цифрой (0 - 9), вы будете знать, что пользователь ввел что-то, что не является цифрой.

В зависимости от того, как сформулировано ваше конкретное назначение, - + и,также может быть действительным (ожидается, что число будет целым?)

Если вы настаиваете на использовании strtol, вам необходимо знать, как работают указатели и указатели на указатели.Если вы это сделаете, вы можете использовать результат в параметре endptr, чтобы проверить, где находится первый недопустимый символ, и решить, является ли ввод основанным на этом числом.

Имейте в виду, что это будет работать только для целых чисел (без десятичной точки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...