C++中的string类(C++字符串)入门完全攻略
前言
string类是STL中basic_string模板实例化得到的模板类。其定义如下:
typedefbasic_stringstring;
basic_string此处可以不必深究。
string类的成员函数有很多,同一个名字的函数也常会有五六个重载的版本。篇幅所限,不能将这些原型一一列出并加以解释。这里仅对常用成员函数按功能进行分类,并直接给出应用的例子,通过例子,读者可以基本掌握这些成员函数的用法。
要想更深入地了解string类,还要阅读C++的参考手册或编译器自带的联机资料。对于前面介绍过的字符串处理的内容,这里不再重复说明。
1.构造函数
string类有多个构造函数,用法示例如下:
strings1();//si="" strings2("Hello");//s2="Hello" strings3(4,'K');//s3="KKKK" strings4("12345",1,3);//s4="234",即"12345"的从下标1开始,长度为3的子串
为称呼方便,本教程后文将从字符串下标n开始、长度为m的字符串称为“子串(n,m)”。
string类没有接收一个整型参数或一个字符型参数的构造函数。下面的两种写法是错误的:
strings1('K'); strings2(123);
2.对string对象赋值
可以用char*类型的变量、常量,以及char类型的变量、常量对string对象进行赋值。例如:
strings1; s1="Hello";//s1="Hello" s2='K';//s2="K”
string类还有assign成员函数,可以用来对string对象赋值。assign成员函数返回对象自身的引用。例如:
strings1("12345"),s2; s3.assign(s1);//s3=s1 s2.assign(s1,1,2);//s2="23",即s1的子串(1,2) s2.assign(4,'K');//s2="KKKK" s2.assign("abcde",2,3);//s2="cde",即"abcde"的子串(2,3)
3.求字符串的长度
length成员函数返回字符串的长度。size成员函数可以实现同样的功能。
4.string对象中字符串的连接
除了可以使用+和+=运算符对string对象执行字符串的连接操作外,string类还有append成员函数,可以用来向字符串后面添加内容。append成员函数返回对象自身的引用。例如:
strings1("123"),s2("abc"); s1.append(s2);//s1="123abc" s1.append(s2,1,2);//s1="123abcbc" s1.append(3,'K');//s1="123abcbcKKK" s1.append("ABCDE",2,3);//s1="123abcbcKKKCDE",添加"ABCDE"的子串(2,3)
5.string对象的比较
除了可以用<、<=、==、!=、>=、>运算符比较string对象外,string类还有compare成员函数,可用于比较字符串。
compare成员函数有以下返回值:
- 小于0表示当前的字符串小;
- 等于0表示两个字符串相等;
- 大于0表示另一个字符串小。
例如:
strings1("hello"),s2("hello,world"); intn=s1.compare(s2); n=s1.compare(1,2,s2,0,3);//比较s1的子串(1,2)和s2的子串(0,3) n=s1.compare(0,2,s2);//比较s1的子串(0,2)和s2 n=s1.compare("Hello"); n=s1.compare(1,2,"Hello");//比较s1的子串(1,2)和"Hello” n=s1.compare(1,2,"Hello",1,2);//比较s1的子串(1,2)和"Hello"的子串(1,2)
6.求string对象的子串
substr成员函数可以用于求子串(n,m),原型如下:
stringsubstr(intn=0,intm=string::npos)const;
调用时,如果省略m或m超过了字符串的长度,则求出来的子串就是从下标n开始一直到字符串结束的部分。例如:
strings1="thisisok"; strings2=s1.substr(2,4);//s2="isi" s2=s1.substr(2);//s2="isisok"
7.交换两个string对象的内容
swap成员函数可以交换两个string对象的内容。例如:
strings1("West”),s2("East"); s1.swap(s2);//s1="East",s2="West"
8.查找子串和字符
string类有一些查找子串和字符的成员函数,它们的返回值都是子串或字符在string对象字符串中的位置(即下标)。如果查不到,则返回string::npos。string::npos是在string类中定义的一个静态常量。这些函数如下:
- find:从前往后查找子串或字符出现的位置。
- rfind:从后往前查找子串或字符出现的位置。
- find_first_of:从前往后查找何处出现另一个字符串中包含的字符。例如:
- s1.find_first_of("abc"); //查找s1中第一次出现"abc"中任一字符的位置
- find_last_of:从后往前查找何处出现另一个字符串中包含的字符。
- find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。
- find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。
下面是string类的查找成员函数的示例程序。
#include#include usingnamespacestd; intmain() { strings1("SourceCode"); intn; if((n=s1.find('u'))!=string::npos)//查找u出现的位置 cout<<"1)"< 9.替换子串
replace成员函数可以对string对象中的子串进行替换,返回值为对象自身的引用。例如:
strings1("RealSteel"); s1.replace(1,3,"123456",2,4);//用"123456"的子串(2,4)替换s1的子串(1,3) cout<10.删除子串
erase成员函数可以删除string对象中的子串,返回值为对象自身的引用。例如:
strings1("RealSteel"); s1.erase(1,3);//删除子串(1,3),此后s1="RSteel" s1.erase(5);//删除下标5及其后面的所有字符,此后s1="RSte"11.插入字符串
insert成员函数可以在string对象中插入另一个字符串,返回值为对象自身的引用。例如:
strings1("Limitless"),s2("00"); s1.insert(2,"123");//在下标2处插入字符串"123",s1="Li123mitless" s1.insert(3,s2);//在下标2处插入s2,s1="Li10023mitless" s1.insert(3,5,'X');//在下标3处插入5个'X',s1="Li1XXXXX0023mitless"12.将string对象作为流处理
使用流对象istringstream和ostringstream,可以将string对象当作一个流进行输入输出。使用这两个类需要包含头文件sstream。
示例程序如下:
#include#include #include usingnamespacestd; intmain() { stringsrc("Avatar1235.2TitanicK"); istringstreamistrStream(src);//建立src到istrStream的联系 strings1,s2; intn;doubled;charc; istrStream>>s1>>n>>d>>s2>>c;//把src的内容当做输入流进行读取 ostringstreamostrStream; ostrStream< 程序的输出结果是:
Avatar
Titanic
123
5.2
K第11行,从输入流istrStream进行读取,过程和从cin读取一样,只不过输入的来源由键盘变成了string对象src。因此,"Avatar"被读取到s1,123被读取到n,5.2被读取到d,"Titanic"被读取到s2,'K'被读取到c。
第12行,将变量的值输出到流ostrStream。输出结果不会出现在屏幕上,而是被保存在ostrStream对象管理的某处。用ostringstream类的str成员函数能将输出到ostringstream对象中的内容提取出来。
13.用STL算法操作string对象
string对象也可以看作一个顺序容器,它支持随机访问迭代器,也有begin和end等成员函数。STL中的许多算法也适用于string对象。下面是用STL算法操作string对象的程序示例。
#include#include #include usingnamespacestd; intmain() { strings("afgcbed"); string::iteratorp=find(s.begin(),s.end(),'c'); if(p!=s.end()) cout< 总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。