我的 _snprintf 函数有一个奇怪的问题, 代码:
char string1[] = "string";
char string2[] = "Description";
char string3[] = "BIOS Date: 05/12/15 15:30:43 Ver: 04.06.05";
char *buffer = new char[64];
int resx = _snprintf(buffer, 64, "[%03u] %s %s = (%s)", 16, string1, string2, string3);
对我来说它返回-1,但为什么呢? 在文档中说,当编码错误发生时,-1返回,但我没有编码任何东西,没有unicode格式? 我只需要长度值来扩展缓冲区
我还尝试了 _snprintf_s 它会导致断言,但必须返回所需的长度
而且我无法获取足够大的缓冲区,因为 string1,string2,string3 可以是实际情况中的任何字符串
谢谢
编辑: 在 Visual Studio 2013 和 2015 中为我工作的最终解决方案 编辑2: 修复了 va_list 的使用(感谢 mch)
string format(const char *fmt, ...)
{
string result;
va_list vl1, vl2;
va_start(vl1, fmt);
va_copy(vl2, vl1);
int needen_size = _vsnprintf(nullptr, 0, fmt, vl1);
if (needen_size > 0)
{
if (char *buffer = new char[needen_size + 1]) {
_vsnprintf(buffer, needen_size, fmt, vl2);
buffer[needen_size] = '\0';
result.assign(buffer);
delete[] buffer;
}
}
va_end(vl1);
va_end(vl2);
return result;
}
最佳答案
当您为大小传递零并为指针传递 NULL 时,它会返回您必须分配的内容/缓冲区大小:
char string1[] = "string";
char string2[] = "Description";
char string3[] = "BIOS Date: 05/12/15 15:30:43 Ver: 04.06.05";
resx = _snprintf(NULL, 0, "[%03u] %s %s = (%s)", 16, string1, string2, string3);
然后再次调用正确的大小
char *buffer = new char[resx+1];
int resx = _snprintf(buffer, resx, "[%03u] %s %s = (%s)", 16, string1, string2, string3);
关于C++ _snprintf 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43321867/