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