vsprintf和wvsprintf的使用區別

場景

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章