2013-07-16 73 views
3

注:這個問題很簡單,但是當我在谷歌正在尋找我沒有得到任何明確的澄清。爲什麼char值分配浮動不工作

我具有以下程序

int main() 
{ 
float c; 
scanf("%f",&c); 
printf("%f",c); 
} 

O/P 當我給一個int值(E,G - 9)它顯示它作爲9.000000

但是當我給char值就像'a'它沒有顯示和顯示0.000000.我知道memory representation of float是完全不同於int但是當我給int value (9)它顯示,但是當我給char (a)這也是int(97)沒有顯示。

它是如何發生的。 char作業期間的內存表示是什麼?

+4

標題表示您的根本誤解。 'char'沒有賦值給'float'。您正在嘗試使用scanf的浮點說明符來解析ASCII字符'a'。術語是關鍵。 –

回答

10

注意,這裏有任何地方沒有char在你的代碼。

這就是scanf假設的工作方式。如果你檢查返回值scanf(就像你應該!)你可能會看到它返回0,意味着沒有項目匹配。

當你給scanf()一個"%f"格式字符串,這意味着「我要你嘗試,並得到了我浮點號碼。當你提供像‘A’輸入,它不會匹配任何東西,因爲'a'是不是有效的浮點數。

http://www.cplusplus.com/reference/cstdio/scanf/

+0

感謝您的澄清,但是當我給int,然後是一個有效的浮動no.i看到類型轉換的維基,但在那裏我看到,當我們分配一個int浮動截斷將是結果,但我的情況爲什麼截斷不會發生。如何解釋char以及scanf如何解釋int。 – pradipta

+2

@pradipta如果您想要使用類型轉換,那麼只需將一些值分配給變量,然後將這些變量分配給其他類型的變量。將'scanf'離開它 - 他*只*將解析你告訴它解析的類型的輸入。 *你是否理解這種差異?*你所看到的與數據類型轉換或解釋無關 - 只有*解析*。 –

+0

但它如何將int作爲int不是float類型。我看到了打印的返回值,它在輸入char值時給出0,並在給出int值時返回。但是它在不匹配時如何取int值到它。 – pradipta

1

scanf在你寫它會嘗試查找和閱讀的數字(int/float)到第一個非數字字符(換行,空格,任何字母形式)。信件是int s,但這是因爲scanf和它應該表現的方式。閱讀文檔。

+0

感謝您的回答。 – pradipta

+3

@pradipta我知道你很有禮貌,但沒有必要感謝每個人的回答。它只是增加了網站的混亂,並沒有增加任何討論。如果答案是有用的,那麼通過「upvoting」答案來表達你的讚賞,並最終接受最好的答案。 –

4

首先,您通常應該用換行符\n結束您的printf格式字符串,或者致電fflush

然後,你應該閱讀scanf文件即它的手冊頁scanf(3)

它可能會失敗,併成功返回匹配的數量:

返回值

這些函數返回輸入項目的數量成功匹配 並被分配,這可以少於規定的數量,或者甚至爲零,在早期匹配失敗的事件中。

如果在第一次成功轉換或發生匹配故障時 之前達到輸入的結尾,則會返回值EOF。如果發生讀取錯誤,EOF爲 也會返回,在這種情況下,流的錯誤 指示符(請參閱ferror(3))已設置,並且errno設置爲 表示錯誤。

當您按照%f轉換規範鍵入輸入字母a時,發生故障。在你的情況下,c變量保持不變(即「未初始化」)。

您應該測試scanf的結果(在您的情況下失敗時爲<=0)。

+0

感謝您的回答。 – pradipta

+0

但它如何將int作爲int類型不是浮點類型。我看到了打印的返回值,它在輸入char值時給出0,並在給出int值時返回。但是它在不匹配時如何取int值到它。 – pradipta

+0

@pradipta它*與*匹配。同樣,'9'是'%f'的有效輸入。看到我的評論,並閱讀文檔。 –