踩過的坑—CString的format方法報錯Incorrect format specifier

前言

在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之類的),就會報這個錯誤。若要輸出%字符,那麼應該寫成%%。

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