为什么_vsnprintf会导致错误

why does _vsnprintf cause an error

本文关键字:错误 vsnprintf 为什么      更新时间:2023-10-16

我有一个这样的帮助函数:

wchar* CHelpTool::PrintfToWstrFromStr( const char *content, ... )
{
    va_list argp;
    va_start(argp, content);
    int nLenstr = strlen(content);
    char*  pstrNum = (char*)MALLOC(nLenstr+50);
    LOG("PrintfToWstrFromStr11111111111111111111111111111111111111111111");
    LOG("PrintfToWstrFromStr    pstrNum ====================================%s", pstrNum);
    LOG("PrintfToWstrFromStr    nLenstr ====================================%d", nLenstr);
    LOG("PrintfToWstrFromStr    content ====================================%s", content);
    _vsnprintf(pstrNum, nLenstr+50-1, content, argp);
    LOG("PrintfToWstrFromStr2222222222222222222222222222222222222222222222");
    AECHAR* wpstrNum = CHelpTool::StrToWstr(pstrNum);
    FREEIF(pstrNum);
    va_end(argp);
    return wpstrNum;
}

当涉及到_vsnprintf时,程序崩溃了。
日志是:

pstrNum ====================================  
nLenstr ====================================68  
content ====================================Gi?m phòng ??ch, t?ng %d%% sát th??ng, kéo dài 2 l??t

注意function _vsnprintf很顺利。

我的函数有什么问题?

strlen()返回了错误的值,content显然长度超过18个字符(68-50)。看起来您有一个多字节字符串正在传入,您可能想要

int nLenstr = mblen(content, MB_CUR_MAX);

这将为你提供正确的字符串长度。

就崩溃而言。我猜_vsnprintf()无法处理在多字节序列中间的缓冲区结束。