我有这样的帮助功能:
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
。
我的功能有什么问题?
答案 0 :(得分:0)
strlen()
返回错误的值,content
显然超过18个字符(68-50)。看起来你传入了一个多字节字符串,你可能想要
int nLenstr = mblen(content, MB_CUR_MAX);
这将为您提供正确的字符串长度。
就崩溃而言。我猜测_vsnprintf()
无法在多字节序列的中间处理缓冲区结束。