CString类字符串处理,以及与Unicode转换

 

   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";

strncpya,(LPCTSTR)str,sizeof(a);              &&correct,没问题  //LP表示长指针 C表示const T代表TCHARUNICODE环境下为宽)    

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而不是2str1也会变为aa;这是CString类的机理,写时复制和引用计数造成的。【Cstring 类为了优化效率,当从一个CString类产生另一个Cstring类时并不重新生成缓冲区,只是将应用计数+1.当需要改写缓冲区内容时,才分配内存,复制内容】

正确的调用方法 strcpy(str.getbuffer(10),"aa"); str.Releasebuffer();

 

CString 的构造

1.CString( const CString& stringSrc );    //Ansi字符串赋值
ex
CString str1("ABCDEF中文123456");
CString str2(str1);

2.CString( TCHAR ch, int nRepeat = 1 ); 
ex
CString str('a',5);
//str="aaaaa"

3.CString( LPCTSTR lpch, int nLength );
ex
CString csStr("abcdef",3);
//csStr="abc"

4.CString( LPCWSTR lpsz );   //宽字符串赋值
ex
wchar_t s[]=L"abcdef";
    CString csStr(s);
   //csStr=L"abcdef"

 

 CString Operation

1.GetLength()

str="abcdef鲁滨逊"

str.getlength( )          //返回值16,不包含末尾的空字符

 

2.MakeReverse( );
str="abcde
鲁滨逊"

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 = "whoisjay"

str.delete(1,3)     //str"wsjay"

 

6.int Insert( int nIndex, TCHAR ch )
int Insert( int nIndex, LPCTSTR pstr )           //
指定位置插入字符或者字符串

str="abc"

str.insert(2,'a');    //str abac

str.insert(2,"how")

 

7.int Remove( TCHAR ch );    //移除字符串里的指定字符   返回值为移除的数目

8.int Replace( TCHAR chOld, TCHAR chNew );              //替换字符,字符串
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );

 

9.void TrimLeft( );
void TrimLeft( TCHAR chTarget );
void TrimLeft( LPCTSTR lpszTargets );
从左删除字符,被删的字符与chTargetlpszTargets匹配,一直删到第一个不匹配的字符为止
例:csStr="aaabaacdef";
    csStr.TrimLeft('a');
    cout<    csStr="aaabaacdef";
    csStr.TrimLeft("ab");
    cout<
无参数时删除空

10.10id TrimRight( );
void TrimRight( TCHAR chTarget );
void TrimRight( LPCTSTR lpszTargets );

 

11.void Empty( ); //清空
12.
Leftint count)从左边取字符串
13
Right
14
Midint first int count)从中间取字符串

15.Format 

%c  字符

%d  整数

%x  16进制 

16int FindOneOf( LPCTSTR lpszCharSet ) const;
查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置
例:csStr="abcdef";
    cout<

 

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);
str.ReleaseBuffer(0);

DWORD sizeMByte = WideCharToMultiByte(CP_OEMCP, 0, widechar, -1, NULL, 0, NULL, FALSE);  //返回字符串的长度
 char* newChar = new char[sizeMByte];
 WideCharToMultiByte(CP_OEMCP, 0, widechar, -1, newChar, sizeMByte, NULL, FALSE);   //
将宽字符串转换为ansi 字符串

MultiByteTowideChar 映射一个字符串到一个宽字符的字符串;
WideCharToMultiByte
映射宽字符串到某个字符串。

 

 

。。。待补充

你可能感兴趣的:(CString类字符串处理,以及与Unicode转换)