如何防止C中的非数字输入?

时间:2015-02-19 18:12:05

标签: c

我写了一个小C程序,它将从用户那里获得输入并检查输入是偶数还是奇数。

#include<stdio.h>

int main()
{
    int n;
    printf("Enter an integer number: ");
    scanf("%d",&n);

    if(n%2 == 0)
    {
        printf("\n%d is an EVEN number.\n",n);
    }
    else
        printf("\n%d is an ODD number.\n",n);

     return 0;
}

但是当我输入字母或符号时,它会将输出显示为0,并表示输入为偶数。如何阻止用户输入字母和符号?最简单的方法是什么?

4 个答案:

答案 0 :(得分:3)

只需检查scanf的返回值 - 它会告诉您成功解析了多少格式对象。在这种情况下,如果它可以解析int,它将返回1,如果它不能解析则返回0。

答案 1 :(得分:3)

您必须检查scanf的返回值。来自the documentation

  

返回值

     

成功分配的接收参数数,如果在分配第一个接收参数之前发生读取失败,则为EOF

应用于您的代码:

#include <stdio.h>
#include <stdlib.h>

int
main()
{
  int n;
  printf("Enter an integer number: ");
  if (scanf("%d", &n) != 1)
    {
      printf("This is not a number.\n");
      return EXIT_FAILURE;
    }
  else if (n % 2 == 0)
    {
      printf("\n%d is an EVEN number.\n", n);
      return EXIT_SUCCESS;
    }
  else
    {
      printf("\n%d is an ODD number.\n", n);
      return EXIT_SUCCESS;
    }
}

答案 2 :(得分:3)

如果输入 是整数,那么scanf()将返回1,因此您可以检查

if (scanf("%d", &integer) != 1)
    invalidInput();

要再次询问用户,您应该知道stdin中可能还有需要阅读的字符,因此您可以使用getchar()将其清除,以便完整的功能

int scanint(const char *const message)
{
    int value;

    printf("%s > ", message);
    while (scanf("%d", &value) != 1)
    {
        int chr;
        printf("\tinvalid input...\n");
        do {
            chr = getchar();
        } while ((chr != EOF) && (chr != '\n'));
        printf("%s > ", message);
    }
    return value;
}

你可以像这样使用它

int main()
{
    int value = scanint("please input an integer");
    printf("your input was: %d\n", value);
    return 0;
}

答案 3 :(得分:1)

我可以给你两种方法:

  1. 非常简单 - 检查scanf()的返回值。 1表示成功(整数读取),如果有任何非整数(或EOF上的EOF),则表示0。

  2. 为其编写代码:

    #include <ctype.h>
    #include <stdlib.h>
    int isNumeric (const char * s)
    {
        if (s == NULL || *s == '\0' || isspace(*s))
            return 0;
        char * p;
        strtod (s, &p);
        return *p == '\0';
    }
    

    现在,在这种情况下,您的scanf必须从用户处获取字符串,然后将该字符串传递给函数isNumeric()