关于CString与0xFFFF的问题

FrankSun80 2014-08-06 04:21:02
问题如下:VS2010新建Win32 Console Application,勾选MFC,要用到CString,具体代码和问题请看源码。

CString str;
TCHAR* p = new TCHAR[31];
p[0] = 0xFFFF; //如果换成别的值,就没有后面的问题:比如 p[0] = 0xFFFB
p[1] = _T('A');
p[2] = _T('A');
p[3] = 0;

CString strP = CString(p); //结果:strP == “AA”

str.Format(_T("%s--%s"), _T("ab"), strP); //结果:str == “”, ,不是我期望的结果!为什么?

str = _T("ab--") + strP; //结果:str == “ab--AA”, 这个是我期望的结果!

delete[] p;

...全文
469 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrankSun80 2014-08-08
  • 打赏
  • 举报
回复
引用 17 楼 vcf_reader 的回复:
[quote=引用 12 楼 sunyeyi 的回复:] [quote=引用 8 楼 vcf_reader 的回复:] [quote=引用 5 楼 sunyeyi 的回复:] [quote=引用 2 楼 mlqxj35674 的回复:] StrP不是“AA”,而是"AA",第一个无法显示
您说得是对的!我的问题还是集中在,为何0xFFFF在字符串中,就不能够使用Format,但是可以使用+,来连接字符串?[/quote] 谁说的不能够使用Format??只是Format之后,0xFFFF是“不可见”字符[/quote] 抱歉,可能是没有表达清楚,注意看这行代码: str.Format(_T("%s--%s"), _T("ab"), strP); //结果:str == “”, ,不是我期望的结果!为什么? Format可以使用,但结果不是我的预期!我的预期,其行为应该和下面这行代码相同: str = _T("ab--") + strP; //结果:str == “ab--AA”, 这个是我期望的结果![/quote] 0xFFFF不是可见字符,Format的本意是“打印”可见字符,既然如此,为什么还要用0xFFFF开头呢?[/quote] 这个原因复杂,简单来说,系统扩展的时候需要存储一些特殊的Key值到数据库中,为了避免和普通的Key冲突(这些Key由用户输入,而且数据库Key必须唯一),就给这些特殊的Key加上0xFFFF前缀。而当我用CString处理这些Key的时候发现Format不好用,但是“+”还可以使用,这是我的主要疑惑。诚然,设计不是太好,不在此次讨论中。
vcf_reader 2014-08-08
  • 打赏
  • 举报
回复
引用 12 楼 sunyeyi 的回复:
[quote=引用 8 楼 vcf_reader 的回复:] [quote=引用 5 楼 sunyeyi 的回复:] [quote=引用 2 楼 mlqxj35674 的回复:] StrP不是“AA”,而是"AA",第一个无法显示
您说得是对的!我的问题还是集中在,为何0xFFFF在字符串中,就不能够使用Format,但是可以使用+,来连接字符串?[/quote] 谁说的不能够使用Format??只是Format之后,0xFFFF是“不可见”字符[/quote] 抱歉,可能是没有表达清楚,注意看这行代码: str.Format(_T("%s--%s"), _T("ab"), strP); //结果:str == “”, ,不是我期望的结果!为什么? Format可以使用,但结果不是我的预期!我的预期,其行为应该和下面这行代码相同: str = _T("ab--") + strP; //结果:str == “ab--AA”, 这个是我期望的结果![/quote] 0xFFFF不是可见字符,Format的本意是“打印”可见字符,既然如此,为什么还要用0xFFFF开头呢?
shen_wei 2014-08-07
  • 打赏
  • 举报
回复
学习学习。。
SiGoYi 2014-08-07
  • 打赏
  • 举报
回复
引用 9 楼 CharlesSimonyi 的回复:
这个和它内部的实现细节有关 str = _T("ab--") + strP 只是开辟一个缓冲区,把两个字符串前后拷贝到缓冲区中,所以没有问题。 0XFFFF这个字符比较特殊,有特殊的用途 0XFFFF 在C++标准库中等于 WEOF WEOF如同单字节中的EOF一样代表文件、流结束或代表出现其它意外错误 CString::Format内部是通过C++库函数vswprintf实现的 而这个vswprintf内部的实现用到了流的概念,在调用write_char()逐个字符处理到0XFFFF的时候,认为流已经结束或是出现意外错误,从而终止操作,错误退出,vswprintf调用失败返回-1。
学到了,0xFFFF还有这样的功效,估计是按异常处理了,所以空间没有分配出来。
brk1985 2014-08-07
  • 打赏
  • 举报
回复
引用 9 楼 CharlesSimonyi 的回复:
这个和它内部的实现细节有关 str = _T("ab--") + strP 只是开辟一个缓冲区,把两个字符串前后拷贝到缓冲区中,所以没有问题。 0XFFFF这个字符比较特殊,有特殊的用途 0XFFFF 在C++标准库中等于 WEOF WEOF如同单字节中的EOF一样代表文件、流结束或代表出现其它意外错误 CString::Format内部是通过C++库函数vswprintf实现的 而这个vswprintf内部的实现用到了流的概念,在调用write_char()逐个字符处理到0XFFFF的时候,认为流已经结束或是出现意外错误,从而终止操作,错误退出,vswprintf调用失败返回-1。
学习了。。。
FrankSun80 2014-08-07
  • 打赏
  • 举报
回复
引用 9 楼 CharlesSimonyi 的回复:
这个和它内部的实现细节有关 str = _T("ab--") + strP 只是开辟一个缓冲区,把两个字符串前后拷贝到缓冲区中,所以没有问题。 0XFFFF这个字符比较特殊,有特殊的用途 0XFFFF 在C++标准库中等于 WEOF WEOF如同单字节中的EOF一样代表文件、流结束或代表出现其它意外错误 CString::Format内部是通过C++库函数vswprintf实现的 而这个vswprintf内部的实现用到了流的概念,在调用write_char()逐个字符处理到0XFFFF的时候,认为流已经结束或是出现意外错误,从而终止操作,错误退出,vswprintf调用失败返回-1。
谢谢您详尽的回复,看来即使是有特殊需求,也不能随意的把0xFFFF放入字符串保存!
FrankSun80 2014-08-07
  • 打赏
  • 举报
回复
引用 7 楼 VisualEleven 的回复:
你的F11进入CString::Format()函数中去看一下了。
谢谢提醒,的确没有能力和时间去仔细研究那个CString源码!
FrankSun80 2014-08-07
  • 打赏
  • 举报
回复
引用 8 楼 vcf_reader 的回复:
[quote=引用 5 楼 sunyeyi 的回复:] [quote=引用 2 楼 mlqxj35674 的回复:] StrP不是“AA”,而是"AA",第一个无法显示
您说得是对的!我的问题还是集中在,为何0xFFFF在字符串中,就不能够使用Format,但是可以使用+,来连接字符串?[/quote] 谁说的不能够使用Format??只是Format之后,0xFFFF是“不可见”字符[/quote] 抱歉,可能是没有表达清楚,注意看这行代码: str.Format(_T("%s--%s"), _T("ab"), strP); //结果:str == “”, ,不是我期望的结果!为什么? Format可以使用,但结果不是我的预期!我的预期,其行为应该和下面这行代码相同: str = _T("ab--") + strP; //结果:str == “ab--AA”, 这个是我期望的结果!
encoderlee 版主 2014-08-06
  • 打赏
  • 举报
回复
这个和它内部的实现细节有关
str = _T("ab--") + strP
只是开辟一个缓冲区,把两个字符串前后拷贝到缓冲区中,所以没有问题。

0XFFFF这个字符比较特殊,有特殊的用途
0XFFFF 在C++标准库中等于 WEOF
WEOF如同单字节中的EOF一样代表文件、流结束或代表出现其它意外错误
CString::Format内部是通过C++库函数vswprintf实现的
而这个vswprintf内部的实现用到了流的概念,在调用write_char()逐个字符处理到0XFFFF的时候,认为流已经结束或是出现意外错误,从而终止操作,错误退出,vswprintf调用失败返回-1。
vcf_reader 2014-08-06
  • 打赏
  • 举报
回复
引用 5 楼 sunyeyi 的回复:
[quote=引用 2 楼 mlqxj35674 的回复:] StrP不是“AA”,而是"AA",第一个无法显示
您说得是对的!我的问题还是集中在,为何0xFFFF在字符串中,就不能够使用Format,但是可以使用+,来连接字符串?[/quote] 谁说的不能够使用Format??只是Format之后,0xFFFF是“不可见”字符
Eleven 2014-08-06
  • 打赏
  • 举报
回复
你的F11进入CString::Format()函数中去看一下了。
FrankSun80 2014-08-06
  • 打赏
  • 举报
回复
引用 3 楼 sols000 的回复:
http://tool.chinaz.com/Tools/Unicode.aspx 我去,\uFFFF输入到框框里就崩溃了,干嘛要往字符串里写无意义的东西 \uFFFB不会有错
这个说了话长,当初为了某个特定的需要,已经在字符串中存储了特殊的字符,由于兼容性的问题,现在不太可能修改这种特殊字符!
FrankSun80 2014-08-06
  • 打赏
  • 举报
回复
引用 2 楼 mlqxj35674 的回复:
StrP不是“AA”,而是"AA",第一个无法显示
您说得是对的!我的问题还是集中在,为何0xFFFF在字符串中,就不能够使用Format,但是可以使用+,来连接字符串?
FrankSun80 2014-08-06
  • 打赏
  • 举报
回复
引用 1 楼 sols000 的回复:
你为何要把_T("ab"),作为参数,%s并不认识_T("ab"), 还是把_T("ab")写在前面
谢谢回复!如果不是p[0] = 0xFFFF,则不会有后面的问题!所以_T("ab")不是问题的关键!
树叶上的蜗牛 2014-08-06
  • 打赏
  • 举报
回复
http://tool.chinaz.com/Tools/Unicode.aspx 我去,\uFFFF输入到框框里就崩溃了,干嘛要往字符串里写无意义的东西 \uFFFB不会有错
mlqxj35674 2014-08-06
  • 打赏
  • 举报
回复
StrP不是“AA”,而是"AA",第一个无法显示
树叶上的蜗牛 2014-08-06
  • 打赏
  • 举报
回复
你为何要把_T("ab"),作为参数,%s并不认识_T("ab"), 还是把_T("ab")写在前面

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧