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

标签 c validation gcc stdin stdio

我有一个函数来验证来自标准输入的数据,我只想获取整数。当我输入字母时它有效,但它不适用于十进制数字。 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);
    }
}

屏幕截图示例:

example screenshot here

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

最佳答案

你应该使用 strtol 或 friend (代码主要受 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);
    }
}

这意味着您应该单独读取该行并提取后面的值。您可能会注意到,需要对调用的有效性执行很多检查,并且这里的代码块远非完美,需要对函数的返回值进行一些说明...

关于c - 如何在 C (GCC) 中只获取整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54732507/

相关文章:

C: malloc,结构错误

c++ - 为什么我只能将文件中的位置指示器 (SetFilePointerEx) 移动 512 乘数?

php - CakePHP 2.3 表单不显示验证错误

php - 在 PHP 中转义粘性表单值中的双引号

c++ - 如何使旧版本的 clang 对 atomic 的默认异常规范感到满意

c - 强制编译器为某个变量使用某个寄存器

c - 如何在 C 代码中重组 tcp 和解码 http 信息?

c - 如何维护从用户空间到内核空间的回调

php - 为什么 PHP 区分缓存的 .php 和 .abc 扩展名?

c++ - 为什么C++使用32位寄存器来存储8位值