You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言阶乘程序使用自定义变量存储结果运行异常问题求助

代码错误点梳理

第一版factorial函数(带endval版本)的问题

  • 乘积逻辑错误:循环内使用endval = number * i直接赋值覆盖原有结果,没有做累积乘法。例如输入5时,循环最后一次执行i=1,endval =5*1=5,最终返回值和原始输入一致,看起来就像for循环没生效。
  • 变量未初始化:endval定义时没有赋初始值,值为内存中的随机垃圾值,后续if(endval ==0)的判断逻辑完全不可靠。
  • 0值处理逻辑错误:当输入为0时,for循环的初始值i = 0-1 = -1,不满足i>0的条件,循环完全不执行,未初始化的endval几乎不可能等于0,不会触发打印1的逻辑,返回值还是垃圾值,导致0!计算异常。

修改后factorial函数(移除endval版本)的问题

  • 0值处理逻辑冲突:当输入为0时,循环不执行,判断number ==0为真,函数内先打印1,随后返回值为0,主函数中又会打印返回的0,两个输出拼接起来就得到了10的错误结果。
  • 边界处理遗漏:没有主动处理0的返回值,正确逻辑应该是输入0或1时直接返回1,不需要进入循环。

其他全局代码问题

  • userchoice数组长度不足:定义为char userchoice[1],使用scanf("%s")读取字符时会自动追加字符串结束符\0,造成数组越界,可能触发未知异常,至少需要定义为char userchoice[2]。
  • 冗余参数:factorial函数的参数i完全没必要作为入参传递,应该改为函数内部的局部变量,避免传入未初始化的numB带来的潜在风险。

修正后的参考实现
#include <stdio.h>
#include <string.h>
#include <conio.h>

// 移除冗余参数,逻辑简化
int factorial(int number)
{
    // 优先处理边界0和1的情况,直接返回1
    if(number == 0 || number == 1){
        return 1;
    }
    int result = number;
    for(int i = number - 1; i > 0; i--){
        result *= i; // 累积乘积,不是覆盖
    }
    return result;
}

int main()
{
    int endvalue, numA;
    char userchoice[2]; // 长度改为2,存字符和结束符
    printf("Enter a choice to make (f for factorial): \n");
    scanf("%s", userchoice);
    if(strcmp(userchoice, "f") == 0){
        printf("Enter a value to get it's factorial: ");
        scanf("%d", &numA);
        endvalue = factorial(numA);
        printf("%d", endvalue);
        return 0;
    }
    getch();
    return 0;
}

内容的提问来源于stack exchange,提问作者Chroma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:09:02