MFC VC++6.0的一个关于字符串的问题

besfanfei 2011-05-31 01:09:09
unsigned char inBuff[25],ouBuff[25],key1[16];
memset(inBuff,0,25);
memset(ouBuff,0,25);
memset(key1,0,16);

CString message_key=_T("cxl");

memcpy(key1,message_key,16);

for(i=0;i<16;i++)
AfxMessageBox(CString(key1[i])+"///");


程序输出:下划线表示输出为空
c///
x///
l///
_
?//
?//
?//
?//
_
_
_
_
_
_
_
_
_



...全文
171 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Camille 2011-05-31
  • 打赏
  • 举报
回复
六楼说的各种码我都不知道,看来还有很多要学习呀。
信阳毛尖 2011-05-31
  • 打赏
  • 举报
回复
这里牵扯到CString与char类型的转换,为何要用内存拷贝方式呢?拷贝也行,但是长度一定要设置准确,出现你的这中情况明显是长度越界造成的
yeaisheng 2011-05-31
  • 打赏
  • 举报
回复
message_key只有3个字符长度,访问超过3个字符当然越界了,第三个字符以后的字符已无法确认了
vcf_reader 2011-05-31
  • 打赏
  • 举报
回复
越界了
yyyyy_3 2011-05-31
  • 打赏
  • 举报
回复
后面的已经越界了.
simoreg 2011-05-31
  • 打赏
  • 举报
回复
这个问题其实比较复杂,我推荐LZ先看一片文章,叫做“生死疆界(上)--- 在new与delete之间”
在VCKBASE的第19期,看完这篇文章后,你会得到一个结论,即:
“在DEBUG 版下,四个FD就是内存的生死疆界”,也就是说,MFC通过额外四个FD来确定是否发生了内存越位!
现在回到现在的问题上,
当i=4时,对于表达式CString(key1[i])
执行前 0xFD0xFD0xFD0xFD
执行后 0xFD0x000xFD0xFD
CString并不是通吃的,实际上,这里已经产生了错误了,
接着 再 +"///",内存中是:
0xFD 0x2F 0x2F 0x2F 0x2F即'/'
那么,为什么只显示3个字符呢?
原因在于,以0xFD开头,系统则认为它可能是BIG5码,因此,系统认为,有3个字符,即(0xFD 0x2F) 0x2F 0x2F
而0xFD 0x2F并不在正常的 BIG5码范围内,因此显示了'?'
另外,由这个例子可以看出,系统(至少是MessageBox)在处理字符时,很可能是先判断一个BYTE,如果这个BYTE大于0x81,则认为是CJK码,而不管第二个BYTE是否有效,这算不算windows的BUG呢?
最后要说明的是,这段程序在release版下是不会出现这样的情况的,原因就在于"四个FD"

King_hhuang 2011-05-31
  • 打赏
  • 举报
回复
memcpy(key1,message_key,16);

->
int nlen = message_key.GetLength()<16 ? message_key.GetLength() : 16;

memcpy(key1,message_key,nlen);
robertbo 2011-05-31
  • 打赏
  • 举报
回复
memcpy(key1,message_key,message_key.GetLength());
只将message_key.GetLength个字符拷贝到字符串中就可以了,程序中拷贝了16个字符,后面的字符没有意义
cityhunter_bj 2011-05-31
  • 打赏
  • 举报
回复
CString message_key=_T("cxl");
message_key只有3个字符长度,当拷贝16个长度是,已经越界了,第三个字符以后的字符根本无法确认是什么
帝国队长 2011-05-31
  • 打赏
  • 举报
回复
memcpy(key1,message_key,16);
把CString的16个字节考过去了,那么后边就是CString的东西,是什么就不定了,你可以看下内存
besfanfei 2011-05-31
  • 打赏
  • 举报
回复
为什么会出现这种输出结果?后面的三个斜杠为什么会减少?

16,472

社区成员

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

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

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