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; 
} 
+0

只是输入1,2,1,然后输入 –

+0

由于前导空格是不是你的格式字符串的一部分。 –

+0

忘记那些愚蠢的逗号和严格的输入规格,只是不要输入任何内容。 'printf(“输入多项式a b c:\ n”); scanf(“%lf%lf%lf”,&a,&b,&c);'然后输入'1 2 1'或用'newline'分隔。 –

有没有办法解决这个问题;这实际上是函数scanf()的一个问题;本身。或者,您可以使用fgets();代替。 尝试

double a=0.0,b=0.0,c=0.0; 
printf("Enter a polynomial:\n"); 
scanf(" %lf, %lf, %lf",&a,&b,&c); 
+1

不是这样(即有办法解决这个问题)。问题在于'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); 
+0

格式字符串现在更好,但会拒绝从'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'将证明额外的输入)。 –