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);
需要提请注意的是:由于你的程序里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.
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);
不过我的程序就有问题.
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(),还是会出错.原因在哪里??
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);
}
{
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);
}
char buf1[]="hello,Kitty";
str.format("%s",buf1);
//strcpy(str.GetBuffer(100),buf1); CString str2;
str2.Format("%d",str.GetLength());
MessageBox(str2);
这样就可以:
char buf1[]="hello,Kitty";
CString str(buf1);
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.
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的内容完好无损.想不明白...
str.RealseBuffer();
问题解决!
是不是你调用myStringToUser函数后改变了strRecv的值,调试一下看看,在调用前和调用后设置一个断点看看
我调试过,的确是在调用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出现的这个问题,分就给认真回答的同胞们吧.