2015-04-27 61 views
6

是什麼下面的代碼的意思是,在Cscanf()函數中的%符號之後的符號是什麼意思?

scanf("%d%#d%d",&a,&b,&c); 

如果給定的值1 2 3它給爲1 0 0

PS-輸出我知道它是用來與printf()語句,但在這裏scanf()聲明它給隨機行爲。

+0

有人糾正我,如果我錯了,但不是'#'只用於'printf'?我認爲它被用於將「0」加到八進制數字中,將「0x」加到十六進制中 – Levi

+0

在任何'scanf'手冊頁中都找不到它。我想你應該有一個警告,告訴你沒有這樣的修飾符。你有編譯警告嗎?實際上,@Levi,[printf man](http://linux.die.net/man/3/printf)顯示了##修飾符 – Eregrith

+1

它在scanf()中的gcc編譯器中工作 – FossArduino

回答

12

TL; DR; - A #%登錄格式字符串scanf()功能是錯誤的代碼。

說明:

這裏的#標誌性格,這是允許在fprintf()和家庭,而不是在fscanf()和家人。

如果您的代碼存在#%被視爲無效的轉換說明符。按照7.21.6.2,

如果轉換規範無效,則行爲未定義

所以,你的代碼產生undefined behaviour

提示:您可以檢查return的值scanf()以檢查有多少元素已成功「掃描」。


然而,FWIW,使用#%dprintf()也是undefined behaviour

僅供參考:依照C11標準文檔,章§7.21.6.1,標記字符部分,(重點煤礦)

結果被轉換爲 '' 替代形式''。對於o轉換,當且僅當必要時強制結果的第一個數字爲零(如果數值和精度均爲0,則打印一個0),它會提高精度。對於x(或X)轉換,非零結果的前綴爲0x(或0X)。對於aAeEfFgG轉換,轉換浮點數的結果總是包含一個小數點字符,即使沒有數字跟隨它。 (通常,只有在數字後面有數字時,纔會在這些轉換結果中出現小數點後的字符。)對於gG轉換,結果中不會刪除結尾的零。 對於其他轉換,行爲未定義。

+0

不適用§7.21.6.1適用於'printf'而不是'scanf'? – wimh

+1

你從標準中引用的是printf家族函數,這在這裏是無關緊要的。 –

+0

@Wimmel對不起,我編輯了答案。我不是英語母語的人,所以有時候我搞砸了。 –