CString类字符串处理,以及与Unicode转换
来源:互联网 发布:矩阵计算 编辑:程序博客网 时间:2024/06/08 13:52
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字符串赋值
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 );
从左删除字符,被删的字符与chTarget或lpszTargets匹配,一直删到第一个不匹配的字符为止
例:csStr="aaabaacdef";
csStr.TrimLeft('a');
cout<<csStr; //baacdef
csStr="aaabaacdef";
csStr.TrimLeft("ab");
cout<<csStr; //cdef
无参数时删除空
10.10id TrimRight( );
void TrimRight( TCHAR chTarget );
void TrimRight( LPCTSTR lpszTargets );
11.void Empty( ); //清空
12.:Left(int count)从左边取字符串
13:Right
14:Mid(int first ,int count)从中间取字符串
15.Format
%c 字符
%d 整数
%x 16进制
16:int FindOneOf( LPCTSTR lpszCharSet ) const;
查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置
例:csStr="abcdef";
cout<<csStr.FindOneOf("cxy")
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转换
- CString类字符串处理,以及与Unicode转换
- CString类字符串处理,以及与Unicode转换
- CString类字符串处理,以及与Unicode转换
- CString类字符串处理,以及与Unicode转换
- Unicode字符串与CString字符串之间的互相转换
- Unicode下整型数与字符串,CString 转换例程
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode下CString与char *转换
- Unicode字符集下CString与char *转换
- Unicode下CString与char *转换
- Unicode字符集下CString与char *转换
- lua __index __newindex upvalue 示例
- awk小结
- 抽象类与接口的区别
- 序列化匿名对象
- daily note
- CString类字符串处理,以及与Unicode转换
- CString类字符串处理,以及与Unicode转换
- CString类字符串处理,以及与Unicode转换
- extaspnet 如何给文本框添加失去焦点的后台事件
- CString类字符串处理,以及与Unicode转换
- Log4j使用指南
- Java多线程之HelloWorld
- 关于跑多线程程序的VC++的设置
- CString类字符串处理,以及与Unicode转换