2010-09-12 107 views
11

有沒有人知道爲什麼C標準庫中沒有snwprintf函數?爲什麼C沒有snwprintf函數?

我知道swprintf,但是它不具有相同的snprintf版本的真實的wchar_t版本的語義。據我所知,有實現使用[v]swprintfsnwprintf功能沒有簡單的方法:

不像snprintfswprintf不返回所需的緩衝區大小;如果提供的緩衝區不足,它只會返回-1。這與編碼錯誤導致的失敗無法區分,所以我無法繼續使用逐漸增大的緩衝區重試,希望它最終能夠成功。

我想我可以將緩衝區的最後一個元素設置爲非NUL,調用swprintf,並假定如果該元素之後是NUL,則會發生截斷。但是,這是保證工作?如果swprintf失敗,則標準不指定緩衝區應處於什麼狀態。 (相反,snprintf描述了哪些字符被寫入,哪些被丟棄。)

+0

我認爲你是對的,當'swprintf'失敗時你不能假設任何有關緩衝區內容的東西。你能用'errno'嗎?我知道它可以在POSIX上工作,但C本身可能不需要'EILSEQ'來編碼錯誤...? – 2010-09-12 21:13:36

+0

@R:謝謝。 'errno'是一個有趣的想法。我想,如果我想要一個可移植的解決方案,我可能不得不修改FreeBSD的一個實際的'vswprintf'實現。 =( – jamesdlin 2010-09-13 18:14:02

+0

請記住,重新實現printf-family函數可能是一個糟糕的主意,因爲你不能保證你複製了所有特定於語言環境的功能 – 2010-09-13 18:20:13

回答

4

請參閱Larry Jones給出的答案here

從本質上講,swprintf在C95加入,同時snprintf在C99和因爲許多實現增加已經回到所需的字符數(snprintf)和它似乎是一個有用的事情,那是被標準化的行爲。他們認爲這種行爲不足以通過添加它(在幾年前沒有這種行爲的情況下被添加)來破壞與swprintf的向後兼容性。

+0

我同意他們不能通過改變'swprintf'來打破向後兼容性,但他們可以添加一個新的'snwprintf'函數 – jamesdlin 2010-09-12 18:00:41

+0

顯然,他們覺得爲了實現這種行爲而添加另一個函數是不值得的 – 2010-09-12 18:37:36

+0

事實上,標準化之前的許多歷史版本'snprintf'都有相同的破壞了「返回-1」行爲作爲'swprintf'.委員會認爲它破壞並且指定了正確的行爲,這違反了舊的Unix(SUSv2)標準的兼容性 – 2010-09-12 21:11:42

相關問題