CString类是vc++给我们封装好的字符串处理类,比String类的功能更加强大,但是由于内部的实现机制蜿蜒复杂, 在实际操作中,不了解CString类的原理,将会很容易产生错误。
先介绍常见字符串拷贝函数:返回值都是dest地址 char * strcpy(char * dest,const char *) char * strncpy(char * dest,const char * ,size_t ) strncpy 对拷贝的字符串长度检测 strncpy(a[20],"whosy",5) 将会出现乱码,字符串的结束字符"/0"未收入,应该将长度设置为6或以上。
CString类转换为char * 以及容易出错的地方 char a[100]; CString str = "i am boy"; strncpy(a,(LPCTSTR)str,sizeof(a)); &&correct,没问题 //LP表示长指针 C表示const T代表TCHAR(UNICODE环境下为宽) strcpy((char *)(LPCTSTR)str,"aaaaaaaa"); &&wrong,在debug模式下会编译失败,release模式下会成功。CString内部有自己的指针,指向自己的缓冲区,当写入的字符超出了范围就会报错,而在Release模式下小于64字节的字符串会自动申请64字节的内存,128,192,256...这是为了减少内存分配次数,增加速度 CString str1=str; strcpy((char*)(LPCTSTR)str,"aa"); 那么传入的字符串长度小于CString类就没关系了?当我们调用str.getlength()时会发现长度是8而不是2;str1也会变为aa;这是CString类的机理,写时复制和引用计数造成的。【Cstring 类为了优化效率,当从一个CString类产生另一个Cstring类时并不重新生成缓冲区,只是将应用计数+1.当需要改写缓冲区内容时,才分配内存,复制内容】 正确的调用方法 strcpy(str.getbuffer(10),"aa"); str.Releasebuffer();
CString 的构造 1.CString( const CString& stringSrc ); //Ansi字符串赋值 2.CString( TCHAR ch, int nRepeat = 1 ); 3.CString( LPCTSTR lpch, int nLength ); 4.CString( LPCWSTR lpsz ); //宽字符串赋值
CString Operation 1.GetLength() str="abcdef鲁滨逊" str.getlength( ) //返回值16,不包含末尾的空字符
2.MakeReverse( ); str.MakeReverse() //逊滨鲁edcba
3.MakeUpper( ); MakeLower( ); //全部转换成大写字母,小写字母
4. int Compare( LPCTSTR lpsz ) const; 区分,不区分大小写比较两个字符串大小 = 0 > return 1 < return -1 int CompareNoCase( LPCTSTR lpsz ) const;
5.int Delete( int nIndex, int nCount = 1 ) str.delete(1,3) //str值 "wsjay"
6.int Insert( int nIndex, TCHAR ch ) str="abc" str.insert(2,'a'); //str abac str.insert(2,"how")
7.int Remove( TCHAR ch ); //移除字符串里的指定字符 返回值为移除的数目 8.int Replace( TCHAR chOld, TCHAR chNew ); //替换字符,字符串
9.void TrimLeft( ); 10.10id TrimRight( );
11.void Empty( ); //清空 15.Format %c 字符 %d 整数 %x 16进制 16:int FindOneOf( LPCTSTR lpszCharSet ) const;
CString 转换 wchar_t * CString str = "Hello,my friend"; wchar_t* wstr = str.AllocSysString(); wchar_t * 转 CString WideCharToMultiByte(CP_ACP,wstr,str.GetBuffer(0),256,NULL,NULL); DWORD sizeMByte = WideCharToMultiByte(CP_OEMCP, 0, widechar, -1, NULL, 0, NULL, FALSE); //返回字符串的长度 MultiByteTowideChar 映射一个字符串到一个宽字符的字符串;
。。。待补充 |