代码之家  ›  专栏  ›  技术社区  ›  Vasudha Dixit

当输入为10且阶乘值仅返回33个数字时,程序失败

  •  -4
  • Vasudha Dixit  · 技术社区  · 6 年前

    什么时候? 如果输入为输入,程序(用于计算阶乘)将失败,而对于所有其他输入(在系统限制内),程序工作正常,除非输入任何字符,否则程序将进入无限循环,输出为“阶乘1等于1”。

    程序如下:

     #include <stdio.h>
        #include <stdlib.h>
    
    int display();
    void fact_fun(int num_fact);
    
    int main()
    {
        int num = 0;
        char next;
    
        next=display();
    
        while( next != '\n')
        {
            num = next;
            fact_fun(num);
            next=display();
        }
    
        return 0;
    }
    
    int display()
    {
        int input;
        printf("\nEnter number to find factorial or press ENTER to exit :");
        scanf("%d",&input);
    
        return input;
    }
    
    void fact_fun(int num_fact)
    {
        int fact=1;
        if((num_fact>='a' && num_fact<='z') || (num_fact>='A' && num_fact<='Z'))
        {
            printf("Alphabet is not allowed");
        }
        else if(num_fact < 0)
        {
            printf("Negative number is not allowed");
        }
        else if(num_fact == 0)
        {
            printf("Factorial of %d is 1",num_fact);
        }
        else
        {
            for(int i = 1; i<= num_fact; i++)
            {
                fact = fact*i;
            }
            printf("Factorial of %d is %d",num_fact,fact);
        }
    }
    

    请指导我哪里出错。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gaurav    6 年前

    display 正在使用的函数 char int 当你使用 %d 中的格式说明符 scanf ,更改为 内景 到处都是。您必须在编译时看到警告:

    warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’
    

    除此之外,当输入的数字为 10

     while(next>=0) //WHEN NEGATIVE NUMBER IS ENTERED IT WILL END THE LOOP
     {
        num = next;
        fact_fun(num);
        next=display();
     }
    

    简化 事实与乐趣:

    void fact_fun(int num_fact)
    {
        int fact =1;
        if(num_fact == 0)
        {
            printf("Factorial of %d is 1",num_fact);
            return;
        }
        else
        {
            for(int i = 1; i<= num_fact; i++)
            {
                fact = fact*i;
            }
            printf("Factorial of %d is %d",num_fact,fact);
        }
    }
    

    输入为10时程序失败的原因: ASCII 换行符的值 \n 也是 10 内景 的价值 \不 与返回的值进行比较 10

    扫描

    int display()
    {
        char inp[10]={0};
        int  input;
        int index=0;
        printf("Enter number to find factorial or press ENTER to exit : ");
    
        while(((input=getchar())!=EOF)&(index<10))
        {
            if((input>='0')&&(input<='9'))
            {
                inp[index++]=input;
            }
            else if(input=='\n')
                break;
            else
                return -1;
        }
        input=atoi(inp);
    
        return input;
    }