场景

        当传递多字节字符串进入如下函数代码,会产生截断,从而引出全文,VS工程使用多字节字符集

inline void LOG_D(LPCTSTR lpszFormat, ...)
{
 va_list args;
 TCHAR szText[LOG4Z_LOG_BUF_SIZE] = { 0 };

 va_start(args, lpszFormat);
 wvsprintf(szText, lpszFormat, args);
 LOGD(szText);
 va_end(args);
}


1)了解vsprintf

vsprintf是sprintf的一个变形,它只有三个参数。vsprintf用于处理携带多个不确定参数的函数,类似printf格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字符串缓冲区和一个格式字符串。第三个参数是指向格式化参数。实际上,该参数代表了变化的传递参数。va_list、va_start和va_end函数在STDARG.H中定义)帮助我们处理变化的参数列表。。使用vsprintf函式,sprintf函式可以这样编写:
int sprintf (char * szBuffer, const char * szFormat, ...)
{
int     iReturn ;
va_list pArgs ;
va_start (pArgs, szFormat) ;
iReturn = vsprintf (szBuffer, szFormat, pArgs) ;
va_end (pArgs) ;
return iReturn ;
}


2)了解wvsprintf

wvsprintf是Windows系统下处理宽字节字符串的API函数,所以在上面的代码中,用处理宽字节的函数方式处理多字节,就会出错


疑问1)

TCHAR是否可以使用? 可以,因为这是一个宏定义,会根据VS工程设置的字符集来确定最终是多字节的char,还是宽字节的wchar


最终正确的代码:

inline void LOG_T(LPCTSTR lpszFormat, ...)
{
 va_list args;
 char szText[LOG4Z_LOG_BUF_SIZE] = { 0 };

 va_start(args, lpszFormat);
 vsprintf(szText, lpszFormat, args);
 LOGT(szText);
 va_end(args);
}