c++将长缓冲区中的const char*转换为char*



我有一个旧的函数,我不能改变API

void TraceMsg(const char* fmt, ...)
{
if (!m_MessageFunctions[TraceLevel]) return;
char msgBuffer[MAX_LOG_MSG];
va_list argList;
va_start(argList, fmt);
vsnprintf(msgBuffer, MAX_LOG_MSG, fmt, argList);
va_end(argList);
m_MessageFunctions[TraceLevel](msgBuffer);
}

MAX_LOG_MSG = 2048

我进入了一个阶段,我想以动态的方式为日志记录器的消息分配更多的空间

我已经阅读了这篇文章:https://code-examples.net/en/q/4904e5
并将我的代码改为:

void TraceMsg(const char* fmt, ...)
{
if (!m_MessageFunctions[TraceLevel]) return;
va_list argList;
va_start(argList, fmt);
size_t size = vsnprintf(NULL, 0,fmt, argList);
char* msgBuffer = new char[size];
vsnprintf(msgBuffer, size, fmt, argList);
va_end(argList);
m_MessageFunctions[TraceLevel](msgBuffer);
delete[] msgBuffer;
}

为什么会有像

这样奇怪的字符
2022-05-03 12:13:20,939 INFO  Make graph edge Bayer@LSC_1_2 ->Input@DeMux_LSC§§§§н
2022-05-03 12:13:20,939 INFO  Make graph edge Bayer@RGB_IR_2_0 ->0@Mux_X2B_BP§§§§нннннњйн‚€нннннннннннннннннннннннннннннннннннн

你能帮帮我吗?

vsnprintf的返回值为

如果n是,将被写入的字符数足够大,不包括终止null字符.

所以你需要给这个加1来给空终止符腾出空间。

最新更新