【问题标题】:Segmentation Error: Quadratic Equation Solver from text file in C分段错误:C 文本文件中的二次方程求解器
【发布时间】:2017-09-26 22:11:31
【问题描述】:

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

【问题讨论】:

  • 你试过先问超人吗?
  • 你的输出不是很可读。您非常接近将复数根的两个值混合在一起(有一个i 将它们分开)。你应该用换行符结束输出。
  • 输入输出流好像是null。您必须在使用 qinputqoutput 之前设置它们的值。您似乎正在尝试读取文本文件qinput.txt。您必须使用fopen 打开文件并将变量qinput 的值设置为您从fopen 获得的流。与输出文件相同。
  • "... 谈了很多关于 scanf 和 printf 的分段错误" 但是这段代码没有使用scanf(), printf()。它正在使用fscanf(), fprintf()。试试FILE *qinput = stdin; FILE *qoutput = stdout;
  • 我认为你想使用标准输入/输出而不是文件,所以用简单的 scanf/printf 替换 fscanf/fprintf。

标签: c segmentation-fault


【解决方案1】:

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

您需要做的是创建一个与文件qinput.txt 对应的FILE 对象,并将指向它的指针存储在变量qinput 中。 qoutput 也是如此。您可以使用fopen() 函数来执行此操作。浏览网络以获取有关如何使用该功能的良好参考或教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2019-08-10
    • 1970-01-01
    相关资源
    最近更新 更多