[英]vswprintf() without buffer size crashes on small buffer instead of EOF. How to pass buffer size
[英]How to determine buffer size for vswprintf under Linux gcc
我需要為格式 function vswprintf() 分配足夠的緩沖區。 當用 ANSI 字符串做同樣的事情時,我使用:
vsnprintf( NULL, NULL, pszFormat, args );
它返回我所需的緩沖區大小。 但是這個function的unicode版本好像沒有這個功能。 當我執行時:
vswprintf( NULL, NULL, pszFormat, args );
結果值始終為 -1。
我發現的唯一解決方案是使用一個大的 static 緩沖區來計算所需的大小。 但我不喜歡這個解決方案:
static const int nBuffSize = 1024;
static XCHAR evalBuff[nBuffSize];
int nSize = vswprintf( evalBuff, nBuffSize, pszFormat, args );
if ( nSize != -1 )
{
return nSize;
}
else
{
throw XXX;
}
有什么方法可以測量 unicode 字符串所需的緩沖區大小?
問候盧德克
打開一個虛擬文件到/ dev / null(或Windows下的NUL)並打印到該文件以獲取大小,效果很好(比打印到字符串快):
#if!defined(_MSC_VER)
printf_dummy_file = fopen(“ / dev / null”,“ wb”);
#其他
printf_dummy_file = fopen(“ NUL”,“ wb”);
#萬一
...
n = vfprintf(printf_dummy_file,format,args);
“ fopen”部分應該執行一次(可以使用靜態變量,如果使用C ++,則可以使用全局變量的構造函數)。
有點重量級,但是如果沒有人提出更好的建議,則可以成倍增加緩沖區,直到足夠大為止:
std::vector<wchar_t> vec(512);
int nSize;
do {
vec.resize(vec.size()*2);
va_list args2;
va_copy args2, args;
nSize = vswprintf(&vec[0], vec.size(), format, args2);
va_end args2
} while(nSize < 0);
// now I have the length, and the formatted string to copy if required.
由於您使用的是POSIX,因此您會認為會為緩沖區空間不足定義一個errno,並且應該在while
條件下檢查該errno,以免其他錯誤不會導致資源緊張的循環。 但是在http://opengroup.org/onlinepubs/007908775/xsh/fwprintf.html上沒有定義這樣的errno,所以我想您必須測試實現時實際得到的errno(如果有)。
另一種選擇是擺脫格式字符串,而是寫入wostringstream
。 但是,如果您需要在編譯后配置格式字符串,那將沒有太大用處。
我找到了一個只有 C++ 的解決方案:
libfmt有自己的 sprintf 實現,適用於std::string
和std::wstring
。
前任:
#include <fmt/core.h>
#include <fmt/printf.h>
std::wstring ws = fmt::sprintf(L"The answer is %d.", 42);
這將獲得緩沖區大小:
vswprintf(nullptr,-1,pszFormat,args);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.