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///
_
?//
?//
?//
?//
_
_
_
_
_
_
_
_
_

解决方案 »

  1.   

    memcpy(key1,message_key,16);
    把CString的16个字节考过去了,那么后边就是CString的东西,是什么就不定了,你可以看下内存
      

  2.   

    CString message_key=_T("cxl"); 
    message_key只有3个字符长度,当拷贝16个长度是,已经越界了,第三个字符以后的字符根本无法确认是什么
      

  3.   

    memcpy(key1,message_key,message_key.GetLength());
    只将message_key.GetLength个字符拷贝到字符串中就可以了,程序中拷贝了16个字符,后面的字符没有意义
      

  4.   

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

  5.   

    这个问题其实比较复杂,我推荐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"        
      

  6.   

    message_key只有3个字符长度,访问超过3个字符当然越界了,第三个字符以后的字符已无法确认了
      

  7.   

    这里牵扯到CString与char类型的转换,为何要用内存拷贝方式呢?拷贝也行,但是长度一定要设置准确,出现你的这中情况明显是长度越界造成的