場景
當傳遞多字節字符串進入如下函數代碼,會產生截斷,從而引出全文,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);
}