2017-03-02 18 views
0

我想创建一个程序,说如果一个数字是奇数或偶数,但如果我输入一个字母,程序必须停止。我想要做的是创建一个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

检查'scanf()'的返回值以查看输入是否可以正确解释为数字。 – EOF

+2

另一种可能性是使用['fgets'](https://linux.die.net/man/3/fgets)将输入作为一个字符串进行采集,然后使用[fgets]查看它是否可以成功转换为数字['strtol'](https://linux.die.net/man/3/strtol)功能家族......这是更多的工作。 – yano

+1

所有变量都是处理器解释为数字的位集合。稍微高一些,我们说某些数字是非数字数据的代码,例如,英文字母,但仅限于上下文。 –

回答

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()不保证不修改失败或不匹配的参数。

+0

谢谢。它现在正在工作。 – Eduardo

+1

这不完全正确,因为如果您输入25lsjd scanf将返回1,它不是一个有效的值 –

+0

是的,我注意到了,但它是一个开始! – Eduardo

1

检查a<0在这种情况下是否不起作用,因为scanf()要么在没有找到整数的情况下返回0,要么返回整数的数量。另一种情况是,如果在任何转换发生之前达到输入,则返回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 */ 
} 
+0

与此代码,程序没有返回任何东西只是空白。 – Eduardo

0

你可以使用的格式,比方说,%40秒(假设你缓冲区为40个字符),然后用strtol将读取到的字符缓冲区(),看看是否令牌是没有额外的整垃圾在最后。

相关问题