我正在尝试编写一个二次方程求解器,它从一个名为qinput.txt的文本文件中读取根,并将根写入qoutput.txt。该程序正在正确编译,但当我尝试运行它时,我收到分段错误。
This MIT page谈了很多关于scanf和printf的分段错误,但我无法弄明白。
我已粘贴下面的代码。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main(){
float a,b,c;
float d,root1,root2;
FILE *qinput;
FILE *qoutput;
fscanf(qinput,"%f%f%f",&a,&b,&c);
d = b * b - 4 * a * c;
if(d < 0){
fprintf(qoutput,"Roots of quadratic equation are: ");
fprintf(qoutput,"%.3f%+.3fi",-b/(2*a),sqrt(-d)/(2*a));
fprintf(qoutput,"%.3f%+.3fi",-b/(2*a),-sqrt(-d)/(2*a));
return 0;
}
else if(d==0){
fprintf(qoutput,"Both roots are equal.\n");
root1 = -b /(2* a);
fprintf(qoutput,"Root of quadratic equation is: %.3f ",root1);
return 0;
}
else{
fprintf(qoutput,"Roots are real numbers.\n");
root1 = ( -b + sqrt(d)) / (2* a);
root2 = ( -b - sqrt(d)) / (2* a);
fprintf(qoutput,"Roots of quadratic equation are: %.3f , %.3f",root1,root2);
}
return 0;
}
答案 0 :(得分:1)
您似乎遇到了分段错误,因为您没有将FILE
指针qinput
和qoutput
初始化为任何内容。当你没有初始化它们时,那些变量没有任何有意义的值 - 就像你正在采取一些随机的内存位置并尝试解释那些作为FILE
对象碰巧出现的乱码。这会导致分段错误,因为您的程序访问了它不应该的内存“段”。
您需要做的是创建一个对应于文件FILE
的{{1}}对象,并在变量qinput.txt
中存储指向它的指针。同样适用于qinput
。您可以使用qoutput
函数执行此操作。浏览网页以获得有关如何使用该功能的良好参考或教程。