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

C语言阶乘计算程序do...while重复循环功能无法正常运行求助

故障原因

  • 核心问题是输入缓冲区残留换行符:前面scanf("%d",&n)读取整数时仅会取走数字字符,你输入完成后按下回车产生的\n换行符会残留在输入缓冲区中。后续执行scanf("%c",&repeat)时,%c格式符不会自动跳过空白字符,会直接把残留的\n读取赋值给repeat,导致repeat的值永远不等于y,循环直接退出。
  • 同时存在隐藏bug:fact变量在循环外初始化,第二次执行循环时会直接复用上次计算完的数值,后续阶乘计算结果会出错。

修复步骤

  1. 处理输入缓冲区残留:将读取repeat的scanf("%c",&repeat)修改为scanf(" %c",&repeat),%c前的空格会让scanf自动跳过所有前置空白字符(包括换行、空格、制表符);也可以在读取repeat前加一行while(getchar()!='\n');手动清空缓冲区残留内容。
  2. 修正fact初始化逻辑:将int fact=1;挪到do循环内部的最开头,每次循环计算阶乘前都重置初始值,避免上次计算结果干扰本次运行。

修复后完整代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define pi 3.14159265

int main()
{
    int n;
    int i;
    char repeat;
    do{
        int fact=1; // 每次循环重置阶乘初始值
        //a部分
        printf("请输入一个正整数存储为变量'n': ");
        scanf("%d",&n);
        while(n<0){
            printf("n的取值不合法,请输入一个正整数存储为变量'n': ");
            scanf("%d",&n);
        }
        //b部分
        if (n>0){
            printf("n当前取值为%d\n",n);
            for(i=1;i<=n;i++){
                fact=fact*i;
            }
        }
        else{
            printf("0的阶乘为1。\n");
        }
        //c部分
        double approx = (pow((double)n,n)*exp(-n))*sqrt(((2*n)+(1/3))*pi);
        //d部分
        printf("%d!的近似值为%lf。\n",n,approx);
        printf("%d!的准确值为%d。\n",n,fact);
        //e部分
        double perror=((fact-approx)/(fact))*100;
        printf("近似值误差为%lf%%\n",perror);
        //f部分
        printf("是否要输入新值重新运行?请输入y或n: ");
        scanf(" %c",&repeat); // 加空格跳过残留换行符
    } while(repeat=='y');

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:06:00