2011-03-29 27 views
1

的va_list的版本是否有下面的代碼中的va_list風采版安全地做非截斷的sprintf:預先計算的字符串長度_snprintf/_snwprintf

// format a char buffer 
int size = 1 + _snprintf(NULL, 0, "%d", 132); 
std::vector<char> buffer (size); 
sprintf_s(&buffer[0], buffer.size(), "%d", 132); 

// format a wchar_t buffer 
int wsize = 1 + _snwprintf(NULL, 0, L"%d", 132); 
std::vector<wchar_t> wbuffer (wsize); 
swprintf_s(&wbuffer[0], wbuffer.size(), L"%d", 132); 

據我可以從文檔告訴和實驗,所有的_vsnprintf函數都不返回長度的計算結果,只能截斷或生成一個錯誤。有其他選擇嗎?

+0

這是使用微軟的編譯器和運行庫,我拿? ANSI標準vsprintf和相關函數都具有「正確」的行爲,即返回長度未經截斷的長度。 (當然,這不是那麼安慰!) – 2011-03-29 10:18:34

+0

是的,沒錯,Microsoft編譯器。 – idij 2011-03-29 10:31:42

+0

我不是C程序員,但我認爲ANSI C'vsprintf'函數返回實際存儲在緩衝區中的字符數,而不是沒有截斷存儲的數字。 – 2011-03-29 10:36:07

回答

2

Visual Studio提供_vscprintf函數來檢查存儲結果字符串所需的緩衝區數量。

+0

很酷,這看起來像我所需要的。 – idij 2011-03-29 10:57:58