如何查看输入的值是否为数字而不是字符?

时间:2017-12-08 04:32:07

标签: c scanf

我想知道是否有人输入了一个号码,如果他们这样做,程序会继续,但如果他们没有,程序就会终止。

int main(void) {
    int i;

    printf("Enter a number: ");
    scanf("%d",&i);
    /*If input is not a number than terminate*/


    /*Otherwise continue*/
    else {
        if (test_prime(i))
            printf("Prime.\n");
        else
            printf("Not prime.\n");
    }
    return 0;
}

如果用户输入"你好"比我希望程序终止。

4 个答案:

答案 0 :(得分:5)

正确的方法就是这样

int main(void) {
    int i;

    printf("Enter a number: ");
    if( scanf("%d",&i) != 1){
        fprintf(stderr,"%s\n","Error in input, input is not number");
        exit(1);
    }
    /*input is a number */

    if (test_prime(i))
       printf("%s\n","Prime.");
    else
       printf("%s\n","Not prime.");

    return 0;
}

检查scanf的返回值有助于我们了解scanf来电是否成功。

或者,您可以使用fgets()获取行输入,然后解析它并检查strtol等函数。 检查输入是否正确,仅应用isdigit()不是解决方案。(如其他答案中所述)。您可以通过提供输入1234进行检查,但您会看到isdigit()解决方案在此处失败,但它不应该。

为了让您了解isdigit解决方案为什么不起作用,从7.4.1.5标准我们可以看到报价

  

isdigit函数测试任何十进制数字。

十进制数字符为01 ... 9

提供解决方案的说明:

如果你看一下它所说的函数的返回值

  

该函数返回分配的输入项数,即可   在早期的情况下,提供的数量少于或甚至为零   匹配失败。

这是正在检查的内容。这也适用于多位数。

答案 1 :(得分:3)

要扩展yano描述的内容,您需要将scanf函数设置为整​​数变量,该变量将计算成功扫描的数量。在这里,您正在寻找一个成功的扫描:如果整数c不是1,则返回一条消息“无效数字”等。

int main(void) {
 int i;
 int c;
 printf("Enter a number: ");
 c = scanf("%d",&i);
 if(c != 1) {
     printf("Invalid number");
 }
 else {
     printf("%d",i);
     return 0;
 }
}

答案 2 :(得分:2)

我们有一个函数isdigit()来识别变量,代码如下:

int main(void) {
   int i;

   printf("Enter a number: ");
   scanf("%d",&i);
   if( isdigit(i) ) {
      printf("It is a digit.");
   }
   else {
      if (test_prime(i))
        printf("Prime.\n");
      else
        printf("Not prime.\n");
   }
   return 0;
}

答案 3 :(得分:1)

使用 ctype 头文件

中的isdigit()

如果输入的值是非数字字符,则此函数将返回0.

在你的情况下,

#include<ctype.h>
if(isdigit(i)==0)
{  // Terminate 
}
else
{  if (test_prime(i))
          printf("Prime.\n");
   else
        printf("Not prime.\n");
}

更多参考访问 https://www.programiz.com/c-programming/library-function/ctype.h/isdigit