为什么C语言中通过点操作符无法正确获取结构体circle的c2.x数值
问题原因及修复方案
核心问题根因
你遇到的数值异常是以下几个错误共同导致的:
- 输入输出格式符与变量类型完全不匹配:你定义的
struct circle中radius、x、y三个成员都是double双精度浮点类型,但不管是scanf读取用户输入还是printf打印数值,你都用了仅适用于int整数类型的%d格式符。类型不匹配属于C语言的未定义行为,会直接导致内存读写错乱,你看到的c2.x是超大无意义值、c1.x看起来正常只是未定义行为的随机表现,本质上所有用%d读写double的操作都是错误的。 - 圆心距离计算逻辑错误:你当前计算坐标差的代码
xDiff = pow(c1.x,2) - pow(c2.x,2)不符合几何计算规则,正确的两点横坐标差的平方应为pow(c1.x - c2.x, 2),纵坐标同理,错误的距离计算会导致后续相交、包含判断完全失效。 - 分支逻辑与返回值不匹配:
intersect函数定义相交返回1、不相交返回0,但你在main函数的case 2中判断返回值为2时才输出不相交,逻辑完全错位,且该分支没有加break,会出现执行流穿透问题。 - 浮点数直接判等存在精度风险:浮点数存储本身存在精度误差,直接用
==判断两个浮点数相等很容易出现误判,建议引入1e-9量级的极小误差阈值做判断。
修复示例
1. 输入逻辑修复
将所有读取double类型的scanf格式符替换为%lf:
// 第一组圆输入修复示例 printf("Radius:\n"); scanf("%lf", &c1.radius); printf("X-Coordinate:\n"); scanf("%lf", &c1.x); printf("Y-Coordinate:\n"); scanf("%lf", &c1.y); // 第二组圆输入同理全部替换为%lf
2. 打印逻辑修复
将所有打印double类型的printf格式符替换为%lf:
printf("X Coordinate of C1 and C2: %lf, %lf\n", c1.x,c2.x); printf("%lf", xDiff);
3. 距离计算逻辑修复
// 通用距离计算修复(intersect和contain函数都要改) double xDiff = pow(c1.x - c2.x, 2); double yDiff = pow(c1.y - c2.y, 2); double dist = sqrt(xDiff + yDiff);
内容的提问来源于stack exchange,提问作者Michelin_Boi
相关产品推荐
相关产品推荐

