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///
_
?//
?//
?//
?//
_
_
_
_
_
_
_
_
_
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///
_
?//
?//
?//
?//
_
_
_
_
_
_
_
_
_
解决方案 »
- 急,求清除CString类型字符串(中英文混排)中的不可见字符的函数代码
- 软件发布后在Windows 98下的问题
- 高分请教(来者有分):socket在一个线程中创建,在另一个线程中使用,会有问题吗?
- 我完了,这都不会弄了.
- 超级简单的问题. 如何控制一个按钮的Disable
- ##请问如何实现激活的机制?就像Windows XP一样##
- 图像旋转模糊失真, 求失真最小的算法 或者方安 UP有分
- VC中的设置问题
- GetOpenFileName具体怎么用呀?我一设ofn.lpstrFile,函数就返回FALSE
- 关于VC读写usb外设的问题
- InvalidateRect你懂的
- 部分银行的网站无法右键查看源文件,寻求查看源文件的工具,仅仅想看下代码,谢谢,在线等!·
把CString的16个字节考过去了,那么后边就是CString的东西,是什么就不定了,你可以看下内存
message_key只有3个字符长度,当拷贝16个长度是,已经越界了,第三个字符以后的字符根本无法确认是什么
只将message_key.GetLength个字符拷贝到字符串中就可以了,程序中拷贝了16个字符,后面的字符没有意义
int nlen = message_key.GetLength()<16 ? message_key.GetLength() : 16;memcpy(key1,message_key,nlen);
在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"