如何在 C (GCC) 中只获取整数?

How to get only integers in C (GCC)?

我有一个函数可以验证来自标准输入的数据,我只想获取整数。当我输入字母时它有效,但它不适用于十进制数字。 n 变为 1,但我在“.”之前得到数字,标准输入不清除。

#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);
    }
}

示例截图:

我应该添加什么才能使其正常工作?或者其他解决方案?

你应该使用 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);
    }
}

这意味着您应该单独阅读该行并在之后提取值。您可能会注意到要执行大量检查以确保调用的有效性,并且此处的代码块远非完美,需要对函数的 return 值进行一些说明...