是这样的:
CString str;
char buf1[]="hello,Kitty";
strcpy(str.GetBuffer(100),buf1);CString str2;
str2.Format("%d",str.GetLength());
MessageBox(str2);得到的字符串长度居然是0,为什么呢?

解决方案 »

  1.   

    MSDN上有解释:
    If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions. 改成这样就行了:
    CString str; 
    char buf1[]="hello,Kitty"; 
    strcpy(str.GetBuffer(100),buf1); 
    str.ReleaseBuffer();//加这一句
    CString str2; 
    str2.Format("%d",str.GetLength()); 
    MessageBox(str2); 
      

  2.   

    既然用了CString , 又何必如此麻烦?CString str1= buf1;
      

  3.   

    大家说的都没错.
    不过我的程序就有问题.
    ReleaseBuffer();是在调用GetBuffer()之后马上就调用呢,还是等对strRecv的一些操作完成之后再调用?不过这两种方式在我的程序里还是会出错. CString strRecv;

    user_t user;
    int nPos;
    int count=0;
    //strRecv.GetBuffer(MAXBUF);
    //strRecv=m_buf;
    strcpy(strRecv.GetBuffer(MAXBUF),m_buf); //for easy using
    strRecv.ReleaseBuffer();
    CString str;
    str.Format("%d",strRecv.GetLength());
    AfxMessageBox(strRecv);

    //strAcc.LockBuffer();
    while(!strRecv.IsEmpty())
    { CString strAcc;
    nPos=strRecv.Find('\n',0);
    strAcc=strRecv.Left(nPos);


    //AfxMessageBox(strAcc);
    myStringToUser(strAcc,user);
    ULONG uid=user.idsn;
    m_mapUsers.SetAt(uid,user);
    strRecv.Delete(0,strRecv.Find('\n',0)+1);
    //strAcc.ReleaseBuffer();
    }myStringToUser(const char* strSrc, user_t& user)
    { //格式化输入到user的各字段
    sscanf(strSrc,"%d\t%d\t%u\t%d\t%d#%s\t%s\t%s",
    &user.age,
    &user.faceid,
    &user.idsn,
    &user.port,
    &user.state,
    user.ip,
    user.nicheng,
    user.sex);
    }执行到strRecv.Delete(0,strRecv.Find('\n',0)+1);会出错,strRecv的值是strRecv={"
    strRecv被破坏了,不知道为什么.原来直接用的是strRecv=m_buf;也是会被破坏掉的,后来就绕路使用了strcpy(),还是会出错.原因在哪里??
      

  4.   

    为方便阅读;CString strRecv;user_t user;
    int nPos;
    int count=0;
    //strRecv.GetBuffer(MAXBUF);
    //strRecv=m_buf;
    strcpy(strRecv.GetBuffer(MAXBUF),m_buf); //for easy using
    strRecv.ReleaseBuffer();
    CString str;
    str.Format("%d",strRecv.GetLength());
    AfxMessageBox(strRecv);//strAcc.LockBuffer();
    while(!strRecv.IsEmpty())
    {CString strAcc;
    nPos=strRecv.Find('\n',0);
    strAcc=strRecv.Left(nPos);
    //AfxMessageBox(strAcc);
    myStringToUser(strAcc,user);
    ULONG uid=user.idsn;
    m_mapUsers.SetAt(uid,user);
    strRecv.Delete(0,strRecv.Find('\n',0)+1);
    //strAcc.ReleaseBuffer();
    }//strRecv.ReleaseBuffer();void myStringToUser(const char* strSrc, user_t& user)
    {//格式化输入到user的各字段
    sscanf(strSrc,"%d\t%d\t%u\t%d\t%d#%s\t%s\t%s",
    &user.age,
    &user.faceid,
    &user.idsn,
    &user.port,
    &user.state,
    user.ip,
    user.nicheng,
    user.sex);
      

  5.   

    缺少异常处理和临界判断:while(!strRecv.IsEmpty()) 

    CString strAcc; 
    nPos=strRecv.Find('\n',0); 
    if(nPos>=0){
      strAcc=strRecv.Left(nPos); 
      strRecv.Delete(0,nPos+1);
    }
    else{
      strAcc=strRev;
      strRev.Empty()
    }
    myStringToUser(strAcc,user); 
    ULONG uid=user.idsn; 
    m_mapUsers.SetAt(uid,user); 

      

  6.   

    CString str; 
    char buf1[]="hello,Kitty"; 
    str.format("%s",buf1);
    //strcpy(str.GetBuffer(100),buf1); CString str2; 
    str2.Format("%d",str.GetLength()); 
    MessageBox(str2); 
      

  7.   

    strcpy(str.GetBuffer(100),buf1); 不需要这样吧
    这样就可以:
    char buf1[]="hello,Kitty";
    CString str(buf1); 
      

  8.   

    需要提请注意的是:由于你的程序里char为以null结尾的字符串,所以在releasebuffer的时候,其长度应该设置为-1.这点msdn解释的很清楚:
    Note that if you keep track of the string length yourself, you should not append the terminating null character. You must, however, specify the final string length when you release the buffer with ReleaseBuffer. If you do append a terminating null character, you should pass –1 for the length to ReleaseBuffer and ReleaseBuffer will perform a strlen on the buffer to determine its length. 
      

  9.   

    不知道你是不是只是单纯的想把那串字符复制给CString,用Format也可以格式化,这么多答案就是都可以解决你的问题,如果想找问题,你认证的调试一下,应该能找到问题。
      

  10.   

    很感谢大家的积极回答.不过问题不在那里.说下我的程序的思路吧:服务器端从数据库中提取出许多用户的信息,每个用户的信息都包含固定的字段,然后将用户的信息格式化到字符串中.字符串中相邻的用户信息用'\n'分隔开,通过Tcp传输到客户端,在客户端再从传输过来的字符串中提取用户的各字段的内容,赋值给一个user_t类型的变量.在客户端接受到的字符串没有错误,从服务器端接收到的字符串strRecv中通过查找'\n'分割符,先提取一个用户的信息,然后通过myStringToUser()将该字符串格式化到user_t的变量中后,在strRecv.Delete(0,strRecv.Find('\n',0)+1);的时候,调试发现strRecv={",问题就是在这里,strRecv被破坏掉了.感谢一楼wltg2001,六楼Joephia,十楼Show_Mike提出的建议,不过问题还是没有解决.
      

  11.   

    //strAcc.LockBuffer();
    while(!strRecv.IsEmpty())
    {CString strAcc;
    nPos=strRecv.Find('\n',0);
    strAcc=strRecv.Left(nPos);
    //AfxMessageBox(strAcc);
    myStringToUser(strAcc,user);  //如果将这句注释掉就没有错误了..但我的功能就不能实现了
    ULONG uid=user.idsn;
    m_mapUsers.SetAt(uid,user);
    strRecv.Delete(0,strRecv.Find('\n',0)+1);
    //strAcc.ReleaseBuffer();
    }strAcc是strRecv的一个拷贝,调用myStringToUser()后,strRecv={",被破坏了,如果没有调用myStringToUser(),那么strRecv的内容完好无损.想不明白...
      

  12.   

    strcpy(str.GetBuffer(100),buf1); 
    str.RealseBuffer();
    问题解决!
      

  13.   


    是不是你调用myStringToUser函数后改变了strRecv的值,调试一下看看,在调用前和调用后设置一个断点看看
      

  14.   


    我调试过,的确是在调用myStringToUser()之后strRecv就变成了strRecv={".问题在于我给myStringToUser()的参数strAcc是strRecv的一个拷贝,居然在那个函数调用之后strRecv被破坏掉了,这里是我想不明白的事情.其他人说ReleaseBuffer()的方法,我也有试过,还有strRecv=m_buf,这个是我最初用的方法,这两个都是有问题的.问题就是在调用myStringToUser()之后,strRecv={",字符串被破坏掉了.现在没有使用CString,问题解决了.方法如下:        const char sep[]="\n";
    char *token; token=strtok(m_buf,sep);
    while(token!=NULL)
    {
    str=token;
    myStringToUser(str,user); m_mapUsers.SetAt(user.idsn,user);
    token=strtok(NULL,sep);
    }
    CString在大多情况下的确很方便,不过有的时候也的确让人很郁闷.问题到此结贴吧,虽然没人真正回答出CString出现的这个问题,分就给认真回答的同胞们吧.