字串格式化函式引起的崩潰

2021-08-13 10:39:52 字數 1428 閱讀 8045

我們常用的格式化字串函式有:

hresult stringcchvprintf

( _out_ lptstr pszdest,

_in_ size_t cchdest,

_in_ lpctstr pszformat,

_in_ va_list arglist

);

int printf (

const

char

* format,..

.);

對於如下的呼叫:

char buf[100] = ;

stringcchvprintf(buf, 100, "select * from member where name like '%sjj%';");

我們在buf中並不能得到想要的select * from member where name like '%sjj%';字串,不出意外,%sjj%處的%s會變成亂碼。因為函式將%sjj%中的%s當做了字串格式化串了,而我們又沒有給最後乙個引數(即可變引數)傳值,根據可變引數的原理,缺省會根據format引數的位址來取乙個位址讓%s進行輸出。具體計算方式參考va_start巨集定義:

#define va_start _crt_va_start

#define _crt_va_start(ap,v) ( ap = (va_list)_addressof(v) + _intsizeof(v) )

這個位址的內容是未知的,所以就可能出現亂碼或崩潰。

要解決這個問題,我們只需要做到一點,在呼叫stringcchvprintf、vsprintf、vswprintf、_vstprintf、printf這樣的一系列函式輸出固定字串時,一定不要將固定字串傳入到pszformat引數,如:

stringcchvprintf(szbuf, 512, "我想輸出單純的%s,我是錯誤的格式示範");  // 錯誤的
這個時候,單純的%s中的%s已經不在單純。

正確的做法是:

stringcchvprintf(szbuf, 512, "%s", "我想輸出單純的%s,我是正確的格式示範");
同理,下面的呼叫方式也是錯誤的、危險的:

std::string strinfo = getinfo();

printf(strinfo.c_str());

字串格式化函式

trim 函式 預設功能為去除字串首尾處的空格 或其它字元 返回乙個人新的字串 str hello world echo str的長度為 strlen str nstr trim str echo 新陣列 nstr的長度為 strlen nstr 去除左邊的空格用ltrim 函式 lstr ltri...

WSPRINTF格式化字串函式

win32 api中乙個很常用的函式wsprintf,這是乙個字串格式化函式,可以將數值按指定格式翻譯成字串,類似於c語言中的printf函式,它的原型是這樣的 int wsprintf lptstr lpout,輸出緩衝區位址 lpctstr lpfmt,格式化串位址 變數列表 變數列表的數目由格...

格式化字串format函式

自python2.6開始,新增了一種格式化字串的函式str.format 可謂威力十足。那麼,他跟之前的 型格式化字串相比,有什麼優越的存在呢?讓我們來揭開它羞答答的面紗。它通過 和 來代替 通過位置 in 1 format kzc 18 out 1 kzc,18 in 2 format kzc 1...