簡體   English   中英

如何確定 Linux gcc 下 vswprintf 的緩沖區大小

[英]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::stringstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM