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

C语言分数约分程序出现编译警告,求可正常运行的修正代码

警告原因说明

  • 第一个%d参数类型不匹配警告:原代码中int *n[2]是指针数组,数组名本身类型为int **,而scanf的%d格式符要求传入int *类型的变量地址,二者类型不匹配。
  • 第二个返回局部变量地址警告:n是getFraction函数内部的栈上局部变量,函数执行结束后对应的内存空间会被系统回收,返回该地址属于非法操作,后续访问会触发未定义行为。

修正后可运行代码

#include <stdio.h>

// 读取用户输入的分子和分母
void getFraction(int *n, int *d) {
    printf("\n 请输入分子和分母 -- ");
    scanf("%d%d", n, d);
}

// 递归计算两个数的最大公约数
int gcd(int a, int b) {
    // 统一取绝对值适配负数场景
    a = a < 0 ? -a : a;
    b = b < 0 ? -b : b;
    if (b == 0)
        return a;
    return gcd(b, a % b);
}

// 约分分数
void reduce(int *a, int *b) {
    int g = gcd(*a, *b);
    *a /= g;
    *b /= g;
    // 统一规范分母为正数
    if (*b < 0) {
        *a = -*a;
        *b = -*b;
    }
}

int main() {
    int a, b;
    char ch;
    do {
        getFraction(&a, &b);
        if (b != 0) {
            reduce(&a, &b);
            printf("\n 约分后的分数为 -- %d / %d", a, b);
        } else {
            printf("\n 分母不能为0");
        }
        printf("\n 是否继续尝试 (Y/N) -- ");
        // 清空输入缓冲区残留的换行符,替代未定义行为的fflush(stdin)
        while (getchar() != '\n');
        scanf("%c", &ch);
    } while (ch == 'y' || ch == 'Y');
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:06:08