前言
在CString上踩過很多坑,避免以後踩過相同的坑,就把該坑記錄~
背景:在轉換環境變量函數裏輸出日誌多次調用了format方法,導致程序崩潰。
例子
類似這樣調用:
CString strPath;
// ....
//strPath 從配置文件中讀入,格式如:%installPath%/test.dat
OutputLog(L"path is %s", strPath);
然後程序出現這樣的錯誤:
解決過程
這個現象是多個線程到同個函數裏輸出該條日誌觸發的,當時以爲是多線程導致的,但是OutPutLog是支持多線程的,所以排除這個可能。
跟進去調試發現是告知某個內存狀態無效,這時有以爲是編譯選項是非mt導致的,改爲mt還是不對,然後就百度了。。。
流下悔恨的淚水,應該早點想到百度dᕦ(・ㅂ・)ᕤ
百度搜索“Incorrect format specifier”後發現也有朋友遇到這樣的錯誤,見鏈接:https://blog.csdn.net/hellokandy/article/details/59110442
總結
出現該問題的原因是:path裏面有%,導致CString的format函數處理%字符出錯,因爲其處理%字符時,會把緊接着的字符一起處理,如果處理時發現組成的字符不認識(即不符合規定,不是%s之類的),就會報這個錯誤。若要輸出%字符,那麼應該寫成%%。