C语言if条件块搭配printf和scanf运行异常是什么原因?
问题排查与修复方案
首先明确:C语言的if条件分支中使用任意数量的printf、scanf函数都没有限制,你的代码运行异常完全是编码错误导致,具体问题如下:
scanf传参未加取地址符&,共2处:- 读取选择值n的代码
scanf("%f", n);需改为scanf("%f", &n);,未传地址的情况下输入的选择值无法写入变量n,n为随机值会导致if判断无法命中预期分支 - 读取i值的代码
scanf("%f", i);需改为scanf("%f", &i);
- 读取选择值n的代码
- 格式符与读取变量数量不匹配:n==3分支下读取坐标的代码
scanf("%f", &x2, &y2);需要读取两个float值,仅写了一个%f,需改为scanf("%f %f", &x2, &y2); - 浮点数绝对值函数使用错误:n==3分支中计算y差值平方的绝对值用了int类型对应的
abs()函数,会强制截断浮点数导致精度丢失,需替换为浮点数专用的fabs()函数 - 逻辑错误:n==2分支中,你需要分别计算正负值对应的结果,但两行sqrt的参数完全相同,都为减去i,负数版本应该改为加i,否则两次输出结果完全一致
- 潜在风险:sqrt()的参数如果为负数会返回NaN导致结果异常,建议开根号前先判断被开方数是否大于等于0,异常时给出提示
- 优化建议:选择值n为整数,用int类型定义更合适,可避免浮点数相等判断的精度问题
修正后完整代码
#include <stdio.h> #include <math.h> int main() { int n; float PO, x1, x2, y1, y2, i, POO, temp; printf("这是几何轨迹计算器,请输入坐标,x和y之间用空格分隔:"); scanf("%f %f", &x1, &y1); printf("请输入选项:1 输入另一个坐标,2 输入正负数值,3 对应直线计算:"); scanf("%d", &n); if (n == 1) { printf("请输入第二个坐标,x和y之间用空格分隔:"); scanf("%f %f", &x2, &y2); printf("现在计算两点之间的距离:\n"); PO = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); printf("两点之间的距离为:%f\n", PO); } else if (n == 2) { printf("请输入第二个坐标,x和y之间用空格分隔:"); scanf("%f %f", &x2, &y2); printf("请输入绝对值数值:"); scanf("%f", &i); printf("现在计算对应距离:\n"); temp = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); PO = sqrt(temp - i); printf("取正值对应的结果为:%f\n", PO); POO = sqrt(temp + i); printf("取负值对应的结果为:%f\n", POO); } else if (n == 3) { printf("请输入第二个坐标,x和y之间用空格分隔:"); scanf("%f %f", &x2, &y2); printf("现在计算对应距离:\n"); temp = (x2 - x1) * (x2 - x1) - fabs((y2 - y1) * (y2 - y1)); if(temp < 0) { printf("被开方数为负,计算结果无效\n"); return 1; } PO = sqrt(temp); printf("计算结果为:%f\n", PO); } else { printf("输入选项无效\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Juanita Saavedra
相关产品推荐
相关产品推荐

