2011-03-29 82 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