void CTest6Doc::OnTest() 
{
int nta,ntb;
char ch1[80];
CString str1(ch1);
nta=str1.GetLength();  //这里结果似乎正常……不过nta=89!
char ch[80][80];       //  去掉这里看似无关的声明,ntb结果就会变成正常值89!
char ch2[80];
// for(int nstr=0;nstr<80;nstr++)
 //          ch2[nstr]=ch[0][nstr];  //这样给ch2赋值,结果也是ntb=6481  !!!
  memcpy(ch2,ch1,80);   
CString str2(ch2);
ntb=str2.GetLength();//这里ntb=6481  !!!
}其实是想问一个很关键的问题,——
怎样把一个很大的结构中的char数组变成CString?而不用“附带”上很多很多无关的数据……因为直接用转换,CString的长都会变得很长很长!然后只能用.Left()来获得所需要的长度!为什么会这样呢?CString很垃圾?(VC6+win2k)

解决方案 »

  1.   

    CString如果有这么大的问题,那就不会流行这么多年了。所以出问题了先看看是否自己的用法有误吧。
    在这里,你要学到的是:字符串以'\0'(0)出现才表示结束
      

  2.   

    char数组的Size是不确定的,不是c++的标准类库
    给CString类型赋值是是以'\0'为结束符的
      

  3.   

    楼主,Anyway, 有一点,使用内存一般来说是要先初始化的:
    如果这样:
    char ch1[80];
    ch1[0] = 'a';
    ch1[1] = '\0'
    CString str1(ch1);
    nta = str1.GetLength();
    相信nta = 1, 我没有算
    所以,使用内存前先初始化, 另外,char 赋值给CString, 只赋值'\0'前面的内容,由于你的内存没有初始化,所以里面的内容不确定,所以, 你不知道哪里是'\0'你得出来的长度是错误的,而且你的程序可能会运行时刻错误
      

  4.   

    char ch1[80];
    CString str1(ch1);????楼主为什么不初始化,你知道ch1的每个元素是什么值吗,还有CString很好,是你不会用
      

  5.   

    初始化问题.//  去掉这里看似无关的声明,ntb结果就会变成正常值89!
    ====================================================
      

  6.   

    你可以在栈上申请char数组的时候,紧接着该数组再申明一个常量char字符并初始化为0。如:char pArray[N];
    const char cEnd = 0;这样你CString szArray(pArray)时,szArray.GetLength()最大也就N了。
      

  7.   

    我现在没做测试哦,不过还是想补充一点
    如CString strTmp;
    strTmp = "123";
    strTmp += 0x00;
    strTmp += "567";
    int len = szArray.GetLength();
    不知你们认为len = ?
    3 or 7.
    我的意思是中间有一个0x00是否会当成结束了呢,也许上面的结果会等于3(可能我举的例子不好),但是我敢肯定的告诉你们在你真要使用的时候,且有效值中间真会有0x00,CString还是有效的,它能反给你真正的长度,也就应该是7。