Как получить только целые числа в C (GCC)? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть функция для проверки данных из стандартного ввода, я хочу получить только целые числа.Это работает, когда я ввожу буквы, но не работает с десятичными числами.n становится 1, но я получаю цифры перед '.', и stdin не очищается.

#include <stdio.h>

int get_Int(int *a) {
    int n;
    do {
        n = scanf("%d", a);
        if (n == 0) {
            printf("Incorrect input. Try again!\n");
            scanf("%*f^\n");
            scanf("%*s");
            continue;
        }

    } while(n == 0);
    return n < 0 ? 0 : 1;
}
int main() {
    int n, t;
    get_Int(&n);
    for (int k = 0; k < n; k++) {
        printf("Input next number\n");        
        get_Int(&t);
        printf("%d\n", t);
    }
}

пример снимка экрана:

example screenshot here

Что мне добавить, чтобы он работал правильно?Или другое решение?

1 Ответ

0 голосов
/ 17 февраля 2019

вы должны использовать strtol или друзей (код, в основном, основан на man strtol и getline):

#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int get_Int(int *a)
{
    if (!a)
        return 0;
    while (1) {
        char *line = NULL, *endptr = NULL;
        size_t len = 0;
        ssize_t nread = getline(&line, &len, stdin);
        long n;

        if (nread == -1)
            continue;           // read failed

        errno = 0;              /* To distinguish success/failure after call */
        n = strtol(line, &endptr, 10 /* assuming base10 */ );

        /* Check for various possible errors */

        if ((errno == ERANGE && (n == LONG_MAX || n == LONG_MIN))
            || (errno != 0 && n == 0)) {
            printf("number out of range, please retry\n");
            continue;           // over/under flow
        }

        if (endptr == line || *endptr != '\n') {
            // No digits were found or not all input was consumed
            printf("Please input integers\n");
            continue;
        }

        *a = n;
        free(line);
        break;
    }
    return 1;
}

int main()
{
    int n, t;
    get_Int(&n);
    for (int k = 0; k < n; k++) {
        printf("Input next number\n");
        get_Int(&t);
        printf("%d\n", t);
    }
}

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

...