2011-01-26 59 views
7

我需要一個C函數,它返回格式化字符串的最終長度,以便我可以正確分配目標字符串,而不是自己計算長度。有snprintf這就無法編寫整個字符串,但不幸的是沒有寬字符替代它。是否有asprintf的wchar_t版本?

swprintf返回-1在錯誤的情況下,不

標題提到asprintf所需長度(爲什麼不一樣的行爲?!?)好像是沒有幫助還,因爲它提供了一個非寬僅版本。

_vscwprintf可以在windows上使用,但我需要一個跨平臺,標準版本或者至少一個Linux版本,我會#ifdef代碼。

任何想法?謝謝!

回答

3

POSIX 2008增加了open_wmemstream功能,它與vfwprintf一起完全符合您的需求。它以前是一個GNU擴展,所以它在GNU系統上已經有很長時間了。

這可以很容易地用來構造一個awprintf包裝。

2

那麼,你的期望似乎有一個根本的缺陷。加上這些:

  1. Windows有你想要什麼
  2. Linux有一個非寬變種(asprintf沒有任何標準,而純粹是一個GNU擴展爲Linux和* BSD)。
  3. POSIX定義了所有相關的字符串/文件作爲以NULL結尾的char*數組,這說明幾乎沒有任何POSIX函數的寬版本。
  4. 除2,3和4之外,所有現代Linux發行版均基於UTF-8,這意味着非廣泛版本是「旨在使用」的內容。

添加這些:你爲什麼需要這樣的東西?當然你在Unix上沒有使用wchar_t s你是;)。如果是的話,還有兩種選擇:切換到類似tchar的解決方案(與平臺相關的typedef)或完全切換到UTF-8。

+0

感謝您的回答。是的,我不得不使用wchar_t並切換到UTF-8可能太昂貴。 – gheorghe1800 2011-01-26 20:39:51

+0

@ gheorghe1800:廢棄wchar_t並使用[UTF-8](http://utf8everywhere.org/)。如果你遵循了它,這個問題就不會出現。 – ybungalobill 2012-05-03 16:59:43

3

是,swprintf。請注意,儘管它的名稱是swprintf,但其寬度相當於snprintf,而不是sprintf,因爲它將緩衝區大小作爲其第二個參數;幸運的是,沒有寬字符的版本沒有緩衝區大小。

另外,由於它在溢出時返回-1,所以您必須以其他方式獲取字符串的總長度。要做到這一點的唯一真正可移植的方法是從一定大小的緩衝區開始,嘗試格式化並查看是否足夠大,如果不足,則增加大小並重新格式化,直到足夠大。你可以想象,這不是很有效率。

+0

謝謝。這是我首先想到的,我只是希望有一個更好的解決方案已經實施。最後,我想我必須自己計算長度,這在一般情況下似乎很容易出錯,但我會確保徹底。 – gheorghe1800 2011-01-26 20:47:16

相關問題