为什么_vsnprintf会导致错误

时间:2014-01-02 02:10:05

标签: c++

我有这样的帮助功能:

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

我的功能有什么问题?

1 个答案:

答案 0 :(得分:0)

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

int nLenstr = mblen(content, MB_CUR_MAX);

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

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