2017-04-01 66 views
-1
#include<stdio.h> 
int main(void) 
{ 
     double c; 
     scanf("%f", &c); 
     printf("%f", c); 
} 

這是我試圖編寫的程序的一個exerpt,但是我遇到了這樣簡單的問題。當我運行這個,並輸入「1.0」時,它打印出「0.007812」。我查看了幾個與我的類似的問題,但找不到合適的答案。scanf正在收集錯誤的輸入

+2

你有沒有看到有關使用錯誤的格式說明符的雙打? – ThingyWotsit

回答

3

您需要使用"%lf"雙。

這是來自clang編譯器的警告。

警告:格式指定類型 '浮動*' 但參數的類型是 '雙*'[-Wformat] 的scanf( 「%F」,& C);

這裏是scanf reference。它的格式是%[*][width][length]specifier。 「浮點數」的說明符是f。所以我們使用%f來讀取float x。要閱讀double x,我們需要指定長度爲l。組合的格式是%lf

+2

你正在觸及最重要的一點。 **在您的編譯字符串中啓用警告**(例如'-Wall -Wextra')並且不接受代碼,直到它編譯*沒有*警告。做得好。 –

0

「%f」是雙精度格式(或至少一個)。 float沒有格式,因爲如果你嘗試傳遞一個float到printf,它會在printf收到它之前被提升爲double 1。在當前標準下,「%lf」也是可以接受的 - 如果後面跟着f轉換說明符(除其他外),那麼l被指定爲無效。

請注意,這是printf格式字符串與scanf(和fscanf等)格式字符串大不相同的地方。對於輸出,你傳遞一個值,當作爲可變參數傳遞時,該值將從float提升爲double。對於輸入來說,你傳遞的是一個沒有被提升的指針,所以你必須告訴scanf你想讀取一個浮點數還是一個double,所以對於scanf,%f表示你想讀一個浮點數,%lf表示你想要讀取一個double(並且,對於它的價值來說,對於long double,對於printf或scanf使用%Lf)。

+1

您可能需要重新訪問'man scanf'並稍微修改您的答案。 –

1

the output嘗試%LF代替%F

#include<stdio.h> 

int main() 
{ 
double c; 
scanf("%lf",&c); 
printf("%lf",c); 
return 0; 
} 

你使用什麼是%F,這是用於常規浮動數據類型。 由於您已指定,您需要使用%lf,這是很長的浮點數。它讀取一個雙。 希望這可以幫助你。