【发布时间】: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。您必须在使用qinput和qoutput之前设置它们的值。您似乎正在尝试读取文本文件qinput.txt。您必须使用fopen打开文件并将变量qinput的值设置为您从fopen获得的流。与输出文件相同。 -
"... 谈了很多关于 scanf 和 printf 的分段错误" 但是这段代码没有使用
scanf(), printf()。它正在使用fscanf(), fprintf()。试试FILE *qinput = stdin; FILE *qoutput = stdout; -
我认为你想使用标准输入/输出而不是文件,所以用简单的 scanf/printf 替换 fscanf/fprintf。
标签: c segmentation-fault