如何确定输入值是否不是数字?

时间:2017-03-02 20:05:34

标签: c if-statement integer

我想创建一个程序,说明一个数字是奇数还是偶数,但如果我输入一个字母,程序必须停止。我想要做的是创建一个if语句,允许程序理解我输入的是一个数字还是其他东西。 这是代码。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int a,b;

    printf("type a number ");
    scanf("%d", &a);
    printf("\n");

    if (a<0) //This is supposed to understand if what I typed is a number, but it's not correct at all.
    {
        printf("ERROR, YOU MUST TYPE A NUMBER, NOT LETTERS.");
        system("PAUSE \n");
        return 0;
    }

    b=(a%2);

    if (b != 0)
    {
        printf("it's an odd number! ");
        printf("\n\n");
        system("PAUSE");
        return 0;
    }
    else
    {
        printf("it's an even number! ");
        printf("\n\n");
        system("PAUSE");
        return 0;
    }
}

3 个答案:

答案 0 :(得分:2)

scanf()返回匹配的格式说明符数,因此如果输入的文本不能解释为十进制整数,则返回零。

printf("type a number ");
int converted = scanf("%d", &a);
printf("\n");

if( converted == 0) 
{
    printf("ERROR, YOU MUST TYPE A NUMBER, NOT LETTERS.");
    system("PAUSE \n");
    return 0;
}

测试少于零将不起作用,因为-1例如是完全有效的十进制整数。如果您将a初始化为-1,它可能似乎有效,但您无法输入负数。这就是说scanf()并不保证不会在匹配失败时修改参数。

答案 1 :(得分:1)

检查a<0在这种情况下是否不起作用,因为scanf()如果未找到整数则返回0,或者找到整数的数量。另一种情况是,如果在进行任何转换之前输入了EOF,则返回EOF。只需检查scanf()是否成功读取一个整数:

if (scanf("%d", &a) != 1) {
    printf("Invalid number\n");
    exit(EXIT_FAILURE);
}

/* else, valid integer was found */

/* other code */

您也可以使用fgets(3)来读取输入字符串,并使用strtol(3)进行更彻底的整数转换。这是一个例子:

char number[50];
char *endptr;
int num;
size_t slen;

if (fgets(number, 50, stdin) != NULL) {

    /* removes newline appended from fgets() */
    slen = strlen(input);
    if (slen > 0 && number[slen-1] == '\n') {
        number[slen-1] = '\0';
    }

    num = strtol(number, &endptr, 10);
    if (endptr == number) {
        /* No digits found */
    }

    if (*endptr != '\0') {
        /* more characters found after number */
    }

    /* more error checking at man page */
}

答案 2 :(得分:0)

您可以使用格式读取字符缓冲区,例如%40s(假设您的缓冲区为40个字符),然后使用strtol()查看令牌是否为整数,而不会在末尾添加额外的垃圾。