scanf在C空间导致删除
我写这个代码来找到二次方程的根。它似乎工作,除非我在扫描部分之前放置一个空格。 (例如在我写的输入中:a=1,b=2, c=1
)。在这种情况下,它只是删除变量。 (在这个例子中,我给c
将被从输入中删除,因此我收到的答案是0,-2而不是-1。)。如果我将空间放在其他地方(a =1,b= 2,c=1
),代码将起作用。scanf在C空间导致删除
我该如何解决这个问题?
int main()
{
double root1 = 0, root2 = 0;
double a = 0., b = 0., c = 0.;
printf("Enter a polynomial:\n");
scanf("a=%lf,b=%lf,c=%lf", &a, &b, &c);
{
if (a == 0)
{
return 0;
}
if ((b * b - 4 * a * c) == 0)
{
root1 = -b/2 * a;
printf("root is %f", root1);
}
else if ((b * b - 4 * a * c) < 0)
{
printf("There are no roots");
}
else {
root1 = (-b + sqrt(b * b - 4 * a * c))/2* a;
root2 = (-b - sqrt(b * b - 4 * a * c))/2* a;
printf("Roots are %f,%f", root1, root2);
}
}
return 0;
}
有没有办法解决这个问题;这实际上是函数scanf()的一个问题;本身。或者,您可以使用fgets();代替。 尝试
double a=0.0,b=0.0,c=0.0;
printf("Enter a polynomial:\n");
scanf(" %lf, %lf, %lf",&a,&b,&c);
不是这样(即有办法解决这个问题)。问题在于'scanf()'被滥用的方式。 –
使用的格式允许在意想不到的地方空间更换
double a=0.,b=0.,c=0.;
printf("Enter a polynomial:\n");
scanf("a=%lf,b=%lf,c=%lf",&a,&b,&c);
。并检查结果。
// v v v v v v v v
if (scanf(" a =%lf , b =%lf , c =%lf", &a, &b, &c) == 3) Oh_Happy_day();
的空间不是需要"%lf"
之前为符将通过领先的空白扫描。有些人喜欢是明确
// x x x Optional
if (scanf(" a = %lf , b = %lf , c = %lf", &a, &b, &c) == 3) Oh_Happy_day();
最好还是使用fgets()
读取线,然后解析它。
因为空间是而不是您在scanf中使用的格式化字符串的一部分。
你应该在格式化字符串添加前导空格:
scanf(" a=%lf, b=%lf, c=%lf", &a, &b, &c);
格式字符串现在更好,但会拒绝从'a = 1.23'开始的输入。也许这就是需要的,但''a =%lf,b =%lf,c =%lf“'会更灵活。 '%lf'之前的空格不需要保持灵活性,但它们使格式更加对称。你也应该测试'scanf()'的结果,以确保3个值被成功转换。当然,让人们输入'a = 1.23,b = 2.34,c = 3.45'符号是不愉快的,尤其是因为他们没有灵活性来输入'b = 2.34,c = 3.45,a = 1.23'将证明额外的输入)。 –
只是输入1,2,1,然后输入 –
由于前导空格是不是你的格式字符串的一部分。 –
忘记那些愚蠢的逗号和严格的输入规格,只是不要输入任何内容。 'printf(“输入多项式a b c:\ n”); scanf(“%lf%lf%lf”,&a,&b,&c);'然后输入'1 2 1'或用'newline'分隔。 –