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

