2017-04-16 80 views
1

我的朋友剛剛開始學習編程。他向我展示了他的代碼,並詢問爲什麼它會返回一些奇怪的數字。看完後,我看到他正在使用scanf(「%。2lf」,& a)來接受輸入,並且按照習慣,我嘗試將其更改爲正常。然後他問我爲什麼有一些奇怪的輸出。搜索後,我仍然沒有找到答案。爲什麼您不能在C中編寫scanf(「%。2lf」,&a)?

有人可以告訴我爲什麼它不起作用嗎?

非常感謝您的支持,對於長期無關緊要的故事以及我的糟糕英語感到抱歉。

編輯:下面

int main() 
    { 
     double a,b,c,delta; 
     printf("Nhap vao 3 so thuc a,b,c: \n"); 
     scanf("%.2lf %.2lf %.2lf",&a,&b,&c); 
     if(a == 0 && b == 0 && c == 0) printf("Phuong trinh co vo so nghiem"); 
     else if(a == 0 && b == 0 && c != 0) printf("Phuong trinh vo nghiem"); 
     else if(a == 0 && b != 0) printf("Phuong trinh co 1 nghiem la: %.2lf",-c/b); 
     else if(a != 0) 
     { 
      delta=b*b-4*a*c; 
      if(delta<0) printf("Phuong trinh vo nghiem"); 
      else if(delta == 0) printf("Phuong trinh co nghiem kep: %.2lf",-b/(2*a)); 
      else if(delta > 0) printf("Phuong trinh co 2 nghiem la:%.2lf, %.2lf",-(b-sqrt(delta))/(4*a),-(b+sqrt(delta))/(4*a)); 
     } 
     return 0; 
    } 
+4

_什麼不工作? –

+5

這是'scanf'轉換規範的無效語法。對於'printf()'有效的''不一定對'scanf()'有效。沒有什麼可說的。具體來說,該點是無效的。 –

+2

你能告訴我們一個? –

回答

3

的C標準規定,scanf轉換說明與%開始,並且POSIX標準規定他們開始要麼%%n$添加的代碼。

C標準和POSIX標準都不允許在轉換說明符中使用.,所以此字符無效。

您的轉換說明符在類型說明符之前可能有一個十進制整數,但它指定的最大字段寬度爲該類型的。這意味着scanf在通過%2lf後停止前最多隻能看到2個字符。

此外,lf指定的值應該是double,所以a應該是double類型。

1

發佈的代碼不起作用,因爲它會導致未定義的行爲。 .字符不是scanf()格式字符串的有效指令或修飾符。根據C標準§7.21.6.213,"If a conversion specification is invalid, the behavior is undefined"

令人恐懼的是,未定義的行爲的一個後果可能是代碼出現工作,至少有時。但是,在不同的情況下,或者在不同的平臺上,代碼可能會失敗。這突出了總是閱讀任何正在使用的函數的文檔的重要性,並特別關注標準的說明。

相關問題