c++-string类详解.doc

上传人:wux****ua 文档编号:8956742 上传时间:2020-04-02 格式:DOC 页数:39 大小:120.50KB
返回 下载 相关 举报
c++-string类详解.doc_第1页
第1页 / 共39页
c++-string类详解.doc_第2页
第2页 / 共39页
c++-string类详解.doc_第3页
第3页 / 共39页
点击查看更多>>
资源描述
C+中针对C语言中处理字符串的难题,在标准库中设计了string类,因此现在编程中涉及到字符串的处理,就可以直接使用string类了。 之所以抛弃char*的字符串而选用C+标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,= 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C+的基本数据类型。首先,为了在我们的程序中使用string类型,我们必须包含头文件。如下: #include /注意这里不是string.h string.h是C字符串头文件1声明一个C+字符串声明一个字符串变量很简单: string Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:a) string s; /生成一个空字符串sb) string s(str) /拷贝构造函数 生成str的复制品c) string s(str,stridx) /将字符串str内“始于位置stridx”的部分当作字符串的初值d) string s(str,stridx,strlen) /将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值e) string s(cstr) /将C字符串作为s的初值f) string s(chars,chars_len) /将C字符串前chars_len个字符作为字符串s的初值。g) string s(num,c) /生成一个字符串,包含num个c字符h) string s(beg,end) /以区间beg;end(不包含end)内的字符作为字符串s的初值i) s.string() /销毁所有字符,释放内存都很简单,我就不解释了。2字符串操作函数 这里是C+字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。a) =,assign() /赋以新值b) swap() /交换两个字符串的内容c) +=,append(),push_back() /在尾部添加字符d) insert() /插入字符e) erase() /删除字符f) clear() /删除全部字符g) replace() /替换字符h) + /串联字符串i) =,!=,=,compare() /比较字符串j) size(),length() /返回字符数量k) max_size() /返回字符的可能最大个数l) empty() /判断字符串是否为空m) capacity() /返回重新分配之前的字符容量n) reserve() /保留一定量内存以容纳一定数量的字符o) , at() /存取单一字符p) ,getline() /从stream读取某值q) ,=,=,=,!=),甚至支持string与C-string的比较(如 str,=,=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string(“aaaa”) 另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等0-大于 字符串的长度时会出错,当nCount过大,没有足够的字符删除时,此函数不执行。FindOneOfint FindOneOf( LPCTSTR lpszCharSet ) const;此函数的功能是在查找lpszCharSet中的任意一个字符,查到一个就把位置返回,没有查到返回0。如:CString str = 0123456789;int x = str.FindOneOf(31);x的值是1。Findint Find( TCHAR ch ) const;int Find( LPCTSTR lpszSub ) const;int Find( TCHAR ch, int nStart ) const;int Find( LPCTSTR pstr, int nStart ) const;返回值查找到的序号,ch待搜索的字符,lpszSub待搜索的字符子串,nStart 从那里开始搜索。如:CString str = 0123456789;int x = str.Find(34,4);返回的值是-1.GetAtTCHAR GetAt( int nIndex ) const;返回标号为nIndex的字符,你可以把字符串理解为一个数组,GetAt类似于.注意nIndex的范围,如果不合适会有调试错误。Insertint Insert( int nIndex, TCHAR ch )int Insert( int nIndex, LPCTSTR pstr )返回修改后的长度,nIndex字符(或字符串)插入后的标号。LeftCString Left( int nCount ) const;返回的字符串的前nCount个字符。Right与Left类似MakeLower ,MakeUpper改变字符的大小写MakeReverse字符倒置,如: CString str = X0123456789; str.MakeReverse();str变为9876543210X+=const CString& operator +=( const CString& string );const CString& operator +=( TCHAR ch );const CString& operator +=( LPCTSTR lpsz );将参数合并到自己身上。如: CString str = 0123456789; str+=ha;str为0123456789ha;strTCHAR operator ( int nIndex ) const;象处理字符数组一样处理字符串。注意是只读的。CString str = 0123456789; str0=x;是错误的。TrimLeft,TrimRightvoid TrimLeft( );void CString:TrimLeft( TCHAR chTarget );void CString:TrimLeft( LPCTSTR lpszTargets );void TrimRight( );void CString:TrimRight( TCHAR chTarget );void CString:TrimRight( LPCTSTR lpszTargets );CString str = nt a;str.TrimLeft();str为“a”;如果没有参数,从左删除字符(nt空格等),至到遇到一个非此类字符.当然你也可以指定删除那些字符.如果指定的参数是字符串,那么遇上其中的一个字符就删除.CString str = abbcadbabcadb ;str.TrimLeft(ab);结果cadbabcadb int CString:Remove( TCHAR ch );ch删除的字符.返回删除字符的个数,有多个时都会删除.CString 与char 之间的转换. char str100 = ”str”;CString sstr = “sstr”;str.Format(“%s”,str);str = LPCTSTR sstr;strcpy(str,(LPCTSTR)sstr);如果是赋值,则要:CString s(_T(This is a test );LPTSTR p = s.GetBuffer();/ 在这里添加使用p的代码if(p != NULL) *p = _T(0);s.ReleaseBuffer(); / 使用完后及时释放,以便能使用其它的CString成员函数str的值变了.将NULL字节放入CString中1,CString str(abc0def, 7); str +=g; int nLength = str.GetLength(); nLength为8.2,CString str(My name is hedan!); str.SetAt(5, 0); int nLength = str.GetLength();注意:不是所有的CString成员函数都可以,在使用时一定要小心。实例:动态配置数据源CString strDsn,strDBQ;strDsn = DSN=test;strDBQ.Format(DBQ=%s,strSourceMDBName);CString strConnect = strDsn + + strDBQ ;strConnect.SetAt(strDsn.GetLength(),0);SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN, Microsoft Access Driver (*.mdb), strConnect);TrimLeft方法的意义是:从字符串左边看起,遇到括号中出现的字符(参数)全部截去,直到出现第一个括号中未出现的字符时停止截除,即使后面又出现了参数中有的字符也不会截去了。TrimLeft方法的意义是:从字符串左边看起,遇到括号中出现的字符(参数)全部截去,直到出现第一个括号中未出现的字符时停止截除,即使后面又出现了参数中有的字符也不会截去了。TrimRight方法类似。去除当前字符串的前导和后缀空格字符TrimLeft()、TrimRight() Trim()功能删除字符串首部和尾部的空格。语法Trim ( string )参数string:string类型,指定要删除首部和尾部空格的字符串返回值String。函数执行成功时返回删除了string字符串首部和尾部空格的字符串,发生错误时返回空字符串()。如果任何参数的值为NULL,Trim()函数返回NULL。CString:Compare int Compare( LPCTSTR lpsz ) const; 返回值 字符串一样 返回0 小于lpsz 返回-1 大于lpsz 返回1 区分大小字符 CString s1( abc ); CString s2( abd ); ASSERT( s1.Compare( s2 ) = -1 ); ASSERT( s1.Compare( abe ) = -1 ); CString:CompareNoCase int CompareNoCase( LPCTSTR lpsz ) const; 返回值 字符串一样 返回0 小于lpsz 返回-1 大于lpsz 返回1 不区分大小字符 CString:Collate int Collate( LPCTSTR lpsz ) const; 同CString:Compare CString:CollateNoCase int CollateNocase( LPCTSTR lpsz ) const; 同CString:CompareNoCase CString:CString CString( ); CString( const CString& stringSrc ); CString( TCHAR ch, int nRepeat = 1 ); CString( LPCTSTR lpch, int nLength ); CString( const unsigned char* psz ); CString( LPCWSTR lpsz ); CString( LPCSTR lpsz ); 例子最容易说明问题 CString s1; CString s2( cat ); CString s3 = s2; CString s4( s2 + + s3 ); CString s5( x ); / s5 = x CString s6( x, 6 ); / s6 = xxxxxx CString s7(LPCSTR)ID_FILE_NEW); / s7 = Create a new document CString city = Philadelphia ; CString:Delete int Delete( int nIndex, int nCount = 1); 返回值是被删除前的字符串的长度 nIndex是第一个被删除的字符,nCount是一次删除几个字符。根据我实验得出的结果:当nCount 要删除字符串的最大长度(GetCount() - nIndex)时会出错,当nCount过大,没有足够的字符删除时,此函数不执行。 例子 CString str1,str2,str3; char a; str1 = nihao ; str2 = nIhao ; int x; / int i=(str1 = str2); str1.Delete(2,3); 如果nCount(3) GetCount() - nIndex (5-2)就会执行错误 CString:Empty Void Empty( ); 没有返回值 清空操作; 例子 CString s( abc ); s.Empty(); ASSERT( s.GetLength( ) = 0 ); CString:Find int Find( TCHAR ch ) const; int Find( LPCTSTR lpszSub ) const; int Find( TCHAR ch, int nStart ) const; int Find( LPCTSTR lpszSub, int nStart ) const; 返回值 不匹配的话返回 -1; 索引以0 开始 nStar 代表以索引值nStart 的字符开始搜索 , 即为包含以索引nStart字符后的字符串 例子 CString s( abcdef ); ASSERT( s.Find( c ) = 2 ); ASSERT( s.Find( de ) = 3 ); Cstring str(“The stars are aligned”); Ing n = str.Find(e,5); ASSERT(n = 12) CString:FindOneOf int FindOneOf( LPCTSTR lpszCharSet ) const; 返回值 不匹配的话返回 -1; 索引以0 开始 注意:返回此字符串中第一个在lpszCharSet中 也包括字符并且从零开始的索引值 例子 CString s( abcdef ); ASSERT( s.FindOneOf( xd ) = 3 ); / d is first match. CString:Format void Format( LPCTSTR lpszFormat, . ); void Format( UINT nFormatID, . ); lpszFormat 一个格式控制字符串 nFormatID 字符串标识符 例子 CString str; Str.Format(“%d”,13); 此时Str为13 CString:GetAt TCHAR GetAt( int nIndex ) const; 返回标号为nIndex的字符,你可以把字符串理解为一个数组,GetAt类似于.注意nIndex的范围,如果不合适会有调试错误。 CString:GetBuffer LPTSTR GetBuffer( int nMinBufLength ); 返回值 一个指向对象的(以空字符结尾的)字符缓冲区的LPTSTR 指针。 参数 nMinBufLength 字符缓冲区的以字符数表示的最小容量。这个值不包括一个结尾的空字符的空间。 说明 此成员函数返回一个指向CString 对象的内部字符缓冲区的指针。返回的LPTSTR 不是const,因此可以允许直接修改CString 的内容。如果你使用由GetBuffer 返回的指针来改变字符串的内容,你必须在使用其它的CString 成员函数之前调用ReleaseBuffer 函数。 在调用ReleaseBuffer 之后,由GetBuffer 返回的地址也许就无效了,因为其它的CString 操作可能会导致CString 缓冲区被重新分配。如果你没有改变此CString 的长度,则缓冲区不会被重新分配。当此CString 对象被销毁时,其缓冲区内存将被自动释放。 注意,如果你自己知道字符串的长度,则你不应该添加结尾的空字符。但是,当你用ReleaseBuffer 来释放该缓冲区时,你必须指定最后的字符串长度。如果你添加了结尾的空字符, 你应该给ReleaseBuffer 的长度参数传递-1 ,ReleaseBuffer 将对该缓冲区执行strlen 来确定它的长度。 下面的例子说明了如何用CString:GetBuffer。 / CString:GetBuffer 例子 CString s( abcd ); #ifdef _DEBUG afxDump CString s s n ; #endif LPTSTR p = s.GetBuffer( 10 ); strcpy( p, Hello ); / 直接访问CString 对象。 s.ReleaseBuffer( ); #ifdef _DEBUG afxDump CString s s CString位于头文件afx.h中。CString 是一种很有用的数据类型。它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多。不管怎样,使用CString有很多特殊的技巧,特别是对于纯C背景下走出来的程序员来说有点难以学习。这篇文章就来讨论这些技巧。使用CString可以让你对字符串的操作更加直截了当。这篇文章不是CString的完全手册,但囊括了大部分常见基本问题。这篇文章包括以下内容:CString 对象的连接 格式化字符串(包括 int 型转化为 CString ) CString 型转化成 int 型 CString 型和 char* 类型的相互转化char* 转化成 CString CString 转化成 char* 之一:使用LPCTSTR强制转化 CString 转化成 char* 之二:使用CString对象的GetBuffer方法 CString 转化成 char* 之三: 和控件的接口CString 型转化成 BSTR 型; BSTR 型转化成 CString 型; VARIANT 型转化成 CString 型; 载入字符串表资源; CString 和临时对象; CString 的效率; 总结 下面我分别讨论。 编辑本段1、CString 对象的连接能体现出 CString 类型方便性特点的一个方面就是字符串的连接,使用 CString 类型,你能很方便地连接两个字符串,正如下面的例子:CString gray(Gray);CString cat(Cat);CString graycat = gray + cat;要比用下面的方法好得多:char gray = Gray;char cat = Cat;char * graycat = malloc(strlen(gray) + strlen(cat) + 1);strcpy(graycat, gray);strcpy(graycat, cat); 编辑本段2、格式化字符串与其用 sprintf() 函数或 wsprintf() 函数来格式化一个字符串,还不如用 CString 对象的Format()方法:CString s;s.Format(_T(The total is %d), total);用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧,比如,把一个整数转化成CString类型,可用如下方法:CString s;s.Format(_T(%d), total);我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识,当然,关于Unicode的话题不在这篇文章的讨论范围。_T()宏在8位字符环境下是如下定义的:#define _T(x) x / 非Unicode版本(non-Unicode version)而在Unicode环境下是如下定义的:#define _T(x) L#x / Unicode版本(Unicode version)所以在Unicode环境下,它的效果就相当于:s.Format(L%d, total);如果你认为你的程序可能在Unicode的环境下运行,那么开始在意用 Unicode 编码。比如说,不要用 sizeof() 操作符来获得字符串的长度,因为在Unicode环境下就会有2倍的误差。我们可以用一些方法来隐藏Unicode的一些细节,比如在我需要获得字符长度的时候,我会用一个叫做DIM的宏,这个宏是在我的dim.h文件中定义的,我会在我写的所有程序中都包含这个文件:#define DIM(x) ( sizeof(x) / si
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!