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
相关产品推荐
相关产品推荐

