在int上输入验证

时间:2015-01-29 21:58:13

标签: c

我在使用下面的代码时出现问题,当我输入一封信时,isdigit无法检测到它并收到错误消息"没有输入"

    int age;
    char buffer[100] = "";
    printf("Enter your age: ");
    fgets(buffer, 100, stdin);
    age = atoi(buffer);
    printf("%d\n",age);


    if (age == NULL)
    {
        printf("Nothing entered\n");
    }

    else if (isdigit(age) == 0)
    {
        printf("Not a number\n");
    }

    else if (age <1 || age > 110)
    {
        printf("Out of range\n");
    }

    else
    {
        printf("Thank you\n");
    }

3 个答案:

答案 0 :(得分:2)

而不是

age = atoi(buffer);
printf("%d\n",age);


if (age == NULL)
{
    printf("Nothing entered\n");
}

使用

if ( sscanf(buffer, "%d", &age) != 1 )
{
    printf("Nothing entered\n");
}
else
{
    printf("%d entered\n", age);
}

答案 1 :(得分:2)

当您有不受信任/可能错误的输入时(例如,几乎总是),

atoi是错误的功能。

使用strtol() (man page)代替,这允许进行广泛的错误检查。

此外,请检查 fgets()的返回值。

char buf[100];
if (fgets(buf, sizeof buf, stdin)) {
    char *end;
    errno = 0;
    long n = strtol(buf, &end, 10);

    // check for errors
    if (n == 0 || n == LONG_MIN || n == LONG_MAX) {
        if (errno != 0) {
            printf("Erroneous input entered\n");
        } else {
            // process valid input
        }
    } else {
        // process valid input
    }
} else {
    printf("nothing was entered\n");
}

顺便说一句,将intNULL(指针)进行比较是没有意义的。如果这不至少触发编译器警告(更好的是,硬错误),则需要提高编译器警告级别或更改为现代编译器。

答案 2 :(得分:0)

行为解释

atoi("x") 

将返回0.这是因为第一个非数字

上的atoi停止
if (age == NULL)
然后

为真,因为NULL定义为0(基本上)

你应该首先检查缓冲区,然后执行atoi