2015-04-14 75 views
1

我剛開始學習C,因爲我是混合性的scanf和printf,我不小心寫了這樣的代碼:scanf函數與精度指定參數

float loan = 0.0f; // loan 
    float rate = 0.0f; // monthly interest rate 
    float mpay = 0.0f; // monthly pay 

    printf("Enter amount of loan: "); 
    scanf("%.2f",&loan); // I am supposed to write scanf("%f",&loan), I was trying to take a float input with two digits after point 

    printf("Enter interest rate: "); 
    scanf("%.2f",&rate); // similar here 

    printf("Enter monthly payment: "); 
    scanf("%.2f",&mpay); // similar here 

我預計這一代碼將顯示三個輸入提示功能,每一個會掛起並等待,直到我輸入一些輸入並按回車。但是發生的是,只有第一個提示正在等待我的輸入,然後當我按下回車鍵時,第二個和第三個提示快速顯示,而不等待我的輸入,就好像代碼從別的地方得到了我的輸入。後來,當我檢查三個應該保存三個輸入的變量的值時,沒有一個實際存儲輸入值。

我回到我的C書,並意識到我混合了printf的最小場和精度參數概念與scanf的,所以我猜那裏沒有這樣的scanf語法?但如果是這樣的話,爲什麼編譯器會編譯,這是不是說scanf也有這樣的語法呢,還是我錯了?我該如何解釋這種奇怪的行爲,不等待我的第二和第三個輸入,而不是將輸入存儲到三個變量中?

+0

你有沒有打印所有3個scanfs後的值? –

+0

'scanf'不包含浮點數精度的字段。你的代碼不能用gcc編譯,並且當你刪除'.2'時會像你期望的那樣工作。我無法解釋你所得到的行爲。 – eigenchris

回答

2

是的,C標準規定的scanf()系列不支持這一點。這是明確的未定義的行爲,這意味着允許發生任何東西

但是一些編譯器確實會在編譯時執行一個警告,檢查格式字符串的有效性。 GCC(和Clang)有-Wformat(由-Wall啓用哪一個應該使用)。如果您使用不同的編譯器,則必須閱讀其文檔或使用靜態分析工具。

從ISO C11委員會草案(N1570),7.21.6.2第13段:

如果轉換規範無效,則行爲是不確定的。 287)

腳註指的是7.31.11 par。 1:

可以將小寫字母添加到fprintf和fscanf中的轉換說明符和長度修飾符。其他字符可用於擴展名。

所以.可以通過scanf()實現的擴展,雖然我不知道一個沒有支持。

1

在TC上運行此代碼,並按照您所說的執行它... 首先,您不應該在scanf中包含字段格式說明符。

在你的情況下,我認爲,你提供的數字除了%f(就像在你的案例中一樣)..因爲scanf行爲異常..這可能發生,你提供的值作爲輸入存儲在不同的地址位置(與2相關的東西)..所以變量率,貸款等沒有顯示值,因爲沒有存儲在它裏面。

0

您無法在scanf中轉換精度。如果使用gcc進行編譯,則應該得到unknown conversion type character ‘.’ in format警告。檢查你的程序

一種方式是打印出來的scanf返回值,你會發現所有這些3 scanf給你0,這意味着沒有3個變量的已掃描的任何值。