使用isdigit验证输入是否为阶乘程序

时间:2014-09-28 02:28:14

标签: c

我在C中编写了以下代码,以创建一个计算任何数字的阶乘的程序。

我想在程序中添加一些验证/错误处理,例如防止输入随机字符,浮点数或负值,所以我使用了isdigit函数。

不幸的是,有一个隐藏的问题,我不知道如何解决。当我输入任何输入时,即使它是正数,也认为它是假的(即不是数字)。

#include <stdio.h>
#include <ctype.h>

int main()
{
    char choice;
    unsigned long long int factorial=1;
    int counter,number;
    for(;;)
    {
        printf("Please , enter a positive integer number only : ");
        scanf("%d",&number);
        fflush(stdin);
        if(isdigit(number))
        {
            for(counter=number;counter>1;counter--)
            factorial*=counter;
            printf("The factorial of number %d is %llu",number,factorial);
        }
        else
        {
            printf("\a\aError\n");
            continue;
        }
        printf("\n1-Press c or C if you want to calculate the factorial of a new number\n2-Press any key         if you want to exit the program\n ");
        scanf("%c",&choice);
        if(choice=='c'||choice=='C')
        {
            factorial=1;
            system("cls");
            continue;
        }
        else
        return 0;
    }
}

2 个答案:

答案 0 :(得分:1)

您使用的是isdigit错误。阅读其文档,了解它的实际功能。

你可能意味着:

 if ( number >= 0 && number <= 9 )

但是,您还需要检查scanf是否成功。如果他们输入了某些字词,那么scanf("%d"会失败并且不会更新number,因此在这种情况下尝试访问number会访问未初始化的变量。要处理这个问题,您可以检查scanf的返回值,或执行:

int number = -1;
scanf("%d",&number);

因为如果输入失败,该值将保持不变。

NB。 Don't use fflush(stdin)

答案 1 :(得分:0)

isdigit检查单个字符是否为十进制数字字符。 但是,你的输入可以说是25个,多个字符。所以,我换了一部分:L

 char input[30];
 for(;;)
 {
  printf("Please , enter a positive integer number only : ");
  scanf("%s",input);
  if(isdigit(input[0]))
  {
   number = atoi(input);
   for(counter=number;counter>1;counter--)

保持程序片段的其余部分相同。 这里,isdigit用于检查输入中的第一个字符是否为数字,因此是由atoi转换为整数值的有效候选。