是什麼下面的代碼的意思是,在Cscanf()函數中的%符號之後的符號是什麼意思?
scanf("%d%#d%d",&a,&b,&c);
如果給定的值1 2 3
它給爲1 0 0
PS-輸出我知道它是用來與printf()
語句,但在這裏scanf()
聲明它給隨機行爲。
是什麼下面的代碼的意思是,在Cscanf()函數中的%符號之後的符號是什麼意思?
scanf("%d%#d%d",&a,&b,&c);
如果給定的值1 2 3
它給爲1 0 0
PS-輸出我知道它是用來與printf()
語句,但在這裏scanf()
聲明它給隨機行爲。
TL; DR; - A #
後%
登錄格式字符串scanf()
功能是錯誤的代碼。
說明:
這裏的#
是標誌性格,這是允許在fprintf()
和家庭,而不是在fscanf()
和家人。
如果您的代碼存在#
後%
被視爲無效的轉換說明符。按照7.21.6.2,
如果轉換規範無效,則行爲未定義
所以,你的代碼產生undefined behaviour。
提示:您可以檢查return
的值scanf()
以檢查有多少元素已成功「掃描」。
然而,FWIW,使用#
與%d
在printf()
也是undefined behaviour。
僅供參考:依照C11
標準文檔,章§7.21.6.1,標記字符部分,(重點煤礦)
#
結果被轉換爲 '' 替代形式''。對於
o
轉換,當且僅當必要時強制結果的第一個數字爲零(如果數值和精度均爲0
,則打印一個0
),它會提高精度。對於x
(或X
)轉換,非零結果的前綴爲0x
(或0X
)。對於a
,A
,e
,E
,f
,F
,g
和G
轉換,轉換浮點數的結果總是包含一個小數點字符,即使沒有數字跟隨它。 (通常,只有在數字後面有數字時,纔會在這些轉換結果中出現小數點後的字符。)對於g
和G
轉換,結果中不會刪除結尾的零。 對於其他轉換,行爲未定義。
不適用§7.21.6.1適用於'printf'而不是'scanf'? – wimh
你從標準中引用的是printf家族函數,這在這裏是無關緊要的。 –
@Wimmel對不起,我編輯了答案。我不是英語母語的人,所以有時候我搞砸了。 –
根據the Standard,使用#
是非法的。
Its use makes your program invoke Undefined Behaviour。
當然,如果你實施定義,它是指行爲爲您實現和它做什麼你的文檔說。
它是做什麼的? – FossArduino
[如果轉換規範無效,行爲未定義。](http://port70.net/~nsz/c/c11/n1570.html#7.21.6.2p13) – wimh
有人糾正我,如果我錯了,但不是'#'只用於'printf'?我認爲它被用於將「0」加到八進制數字中,將「0x」加到十六進制中 – Levi
在任何'scanf'手冊頁中都找不到它。我想你應該有一個警告,告訴你沒有這樣的修飾符。你有編譯警告嗎?實際上,@Levi,[printf man](http://linux.die.net/man/3/printf)顯示了##修飾符 – Eregrith
它在scanf()中的gcc編譯器中工作 – FossArduino