分段错误:C中文本文件的二次方程求解器

时间:2017-09-26 22:11:32

标签: c segmentation-fault

我正在尝试编写一个二次方程求解器,它从一个名为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;
}

1 个答案:

答案 0 :(得分:1)

您似乎遇到了分段错误,因为您没有将FILE指针qinputqoutput初始化为任何内容。当你没有初始化它们时,那​​些变量没有任何有意义的值 - 就像你正在采取一些随机的内存位置并尝试解释那些作为FILE对象碰巧出现的乱码。这会导致分段错误,因为您的程序访问了它不应该的内存“段”。

您需要做的是创建一个对应于文件FILE的{​​{1}}对象,并在变量qinput.txt中存储指向它的指针。同样适用于qinput。您可以使用qoutput函数执行此操作。浏览网页以获得有关如何使用该功能的良好参考或教程。