2016-11-18 52 views
0

我寫這個代碼來找到二次方程的根。它似乎工作,除非我在掃描部分之前放置一個空格。 (例如在我寫的輸入中: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'分隔。 –

回答

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); 
+1

不是這樣(即有辦法解決這個問題)。問題在於'scanf()'被濫用的方式。 –

2

使用的格式允許在意想不到的地方空間更換

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()讀取,然後解析它。

0

因爲空間是而不是您在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'將證明額外的輸入)。 –