我們常用的格式化字串函式有:
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...