踩过的坑—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之类的),就会报这个错误。若要输出%字符,那么应该写成%%。

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