大家都会遇到的有关问题 TRACE %s 和 %S 求高手解释
大家都会遇到的问题 TRACE %s 和 %S 求高手解释
CString str ;
当用 TRACE ( ---- %s ,str) 的时候 显示 第一个字符 // 例如 str = L"1231baaf" 只会显示一个 1
当用 TRACE ( ---- %S ,str) 的时候 可以全部显示 //但是 str = L"faa今天" 程序就崩溃了
经过我的试验 貌似 用%S的时候 TRACE 汉字 就会出错 而 %s 又不是 %c 为何只显示一个字符?
各位高手解释一下 这个 现象
ps
1 .程序崩溃肯定是 这条TRACE语句引起的 我加了断点调试的,
2 .使用VS2010 默认向导建立的对话框工程 win7系统( 貌似 和 这个关系不大)
------解决方案--------------------
http://blog.sina.com.cn/s/blog_702b606a0100y56b.html
再使用 TRACE ("---- %S",str);可以输出了
或者是http://topic.****.net/u/20081215/21/38b67908-9152-4ebf-8d8a-9c8afb826dc7.html
------解决方案--------------------
楼主理解了%s和%S的区别吗?跟程序的字符集设置有关。
如果你的程序是UNICODE,那么%s表示对应的参数是一个WCHAR*,而%S对应的参数是一个char*
如果你的程序是ANSI,那么%s表示对应的参数是一个char*,而%S对应的参数是一个WCHAR*
从现象看,你的CString貌似被理解成CStringA了,应该跟TRACE和格式化字符串统一才对,理论上不应该出现这种错误。我猜测唯一的可能性是:
1、你的程序是用UNICODE方式编译的
2、CString==CStringW
3、TRACE的格式化串写错了,应该用TRACE(L"%s", str); 结果你用了TRACE("%s", str); TRACE宏本身用的是ATL中的AtlTrace类,它同时支持UNICODE/ANSI两种格式化串写法,都不会导致编译错误,但是如果你用ANSI格式化串,后面可变参数的含义就可能被理解成是ANSI串指针(实际它是UNICODE串指针),当然只显示一个字符。
希望这是真实原因,否则我感觉无从解释。
CString str ;
当用 TRACE ( ---- %s ,str) 的时候 显示 第一个字符 // 例如 str = L"1231baaf" 只会显示一个 1
当用 TRACE ( ---- %S ,str) 的时候 可以全部显示 //但是 str = L"faa今天" 程序就崩溃了
经过我的试验 貌似 用%S的时候 TRACE 汉字 就会出错 而 %s 又不是 %c 为何只显示一个字符?
各位高手解释一下 这个 现象
ps
1 .程序崩溃肯定是 这条TRACE语句引起的 我加了断点调试的,
2 .使用VS2010 默认向导建立的对话框工程 win7系统( 貌似 和 这个关系不大)
------解决方案--------------------
http://blog.sina.com.cn/s/blog_702b606a0100y56b.html
再使用 TRACE ("---- %S",str);可以输出了
或者是http://topic.****.net/u/20081215/21/38b67908-9152-4ebf-8d8a-9c8afb826dc7.html
------解决方案--------------------
楼主理解了%s和%S的区别吗?跟程序的字符集设置有关。
如果你的程序是UNICODE,那么%s表示对应的参数是一个WCHAR*,而%S对应的参数是一个char*
如果你的程序是ANSI,那么%s表示对应的参数是一个char*,而%S对应的参数是一个WCHAR*
从现象看,你的CString貌似被理解成CStringA了,应该跟TRACE和格式化字符串统一才对,理论上不应该出现这种错误。我猜测唯一的可能性是:
1、你的程序是用UNICODE方式编译的
2、CString==CStringW
3、TRACE的格式化串写错了,应该用TRACE(L"%s", str); 结果你用了TRACE("%s", str); TRACE宏本身用的是ATL中的AtlTrace类,它同时支持UNICODE/ANSI两种格式化串写法,都不会导致编译错误,但是如果你用ANSI格式化串,后面可变参数的含义就可能被理解成是ANSI串指针(实际它是UNICODE串指针),当然只显示一个字符。
希望这是真实原因,否则我感觉无从解释。