自从大家开始学习C++,相信不少朋友都注意到了C++的这个新特性(相较于C)。有人说要想学习C++就要先忘掉C,博主本人并不完全赞成这种说法,但学习C++的过程中确实要改变一些以前学C的习惯,string类(型)无疑是C++的大亮点之一,有了string类(型),我们再也不用用C中string.h中的那堆以str开头的函数了(C++里头文件是cstring).下面就string类(型)做几点说明。
1.要用string类,请先包含头文件,注意了与string.h区别开。
2.string类型的实质:其实并没有string这种基本类型,正确应该读作string类,是的,string其实是类名,所以我们以string声明变量的过程实际上是string类的对象实例化的过程,后续我们在讲C++的封装时会反复遇到对象实例化这个专有名词。这也就解释了为什么我们用string声明的变量加上一个点就可以调用很多函数。C++的结构体和类里面都可以声明/定义函数,这又是C++相较于C的一个较大的变动。
好的,废话不多说,我们赶快进入string类用法的学习中吧!
注:请同学们粘贴下文代码到自己的IDE中查看结果,自己动手,记忆更深刻。
**
一:字符串的声明及初始化
**
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="I am string1!";//可以这样赋值
string str2("I am string2!");//还可以这样赋值
string str3("ABCDEFGH",3);//取前三个字母给str3初始化
string str4(str3);//也可以这样初始化,实际是在调用拷贝构造函数
string str5(3,'A');//用三个A作为str5的值,注意与ste3区分
string str6("AB1245329",1,5);//从a[1]开始(包括a[1]向后取5个字符
//用来初始化,a指的是用来赋值的字符数组;
cout<<str1<<endl;
cout<<str2<<endl;
cout<<str3<<endl;
cout<<str4<<endl;
cout<<str5<<endl;
cout<<str6<<endl;
return 0;
}
二:string的相关成员函数
1.assigh()赋值函数
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str("wozhendehaoshuai!");//以此为例,我们来看函数的用法
str.assign("I looks better!");
cout<<str<<endl;//相当于str="I looks better!";
//这个例子除了告诉我们重新赋值的函数之外,还告诉我们字符串里
//可以有空格,但cin又读不了空格,所以我们用getline(cin,str)来读
return 0;
}
2.swap()函数(交换两个字符串的内容)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("I am string1!");
string str2("I am string2!");
cout<<str1<<endl<<str2<<endl;
str1.swap(str2);//交换str1与str2的值
cout<<str1<<endl<<str2<<endl;
return 0;
}
3.直接用“+=”给字符串尾部添加字符串
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("I am still handsome!");
string str2(" and you are handsome,too");
cout<<str1<<endl<<str2<<endl;
str1+=str2;//把str2的内容添加到str1尾部
cout<<str1<<endl<<str2<<endl;
return 0;
}
4.用insert()成员函数给字符串插入字符
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("weishenmewozhemeshuai?");
string str2="hhhhh";
str1.insert(3,str2);//在前三个元素后面插入str2
cout<<str1<<endl;//输出 weihhhhhshenmewozhemeshuai?
return 0;
}
insert()函数的用法还没完呢!
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("weishenmewozhemeshuai?");
string str2="012345";
str1.insert(3,str2,2,4);//在前三个元素后面插入
//并且只插入从str2[2]开始往后四个字符
cout<<str1<<endl;//输出 wei2345shenmewozhemeshuai
return 0;
}
5.有了erase(),字符串的部分删除变得好简单!!!
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("weishenmewozhemeshuai?");
str1.erase(3,5);//前面三个不删,从第四个开始一共删除5个
//所以删除的是shenm
cout<<str1<<endl;//输出weiewozhemeshuai?
return 0;
}
6.replace()我们用的最多,可以让你随心所欲的操作字符串!
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("weishenmewozhemeshuai?");
str1.replace(3,5,"hh");//用法可以类比前面
//前面三个元素不变,从第四个元素开始str1[3]连续选中5个字符,
//把这5个字符用后面的字符串替换。
cout<<str1<<endl;
return 0;
}
7.然后比较有用的是find()函数,能帮你返回你想要查找的字符串的第一个下标,查不到返回4294967295。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("weishenmewozhemeshuai?");
cout<<str1.find("en")<<endl;//输出5
cout<<str1.find("e")<<endl;//输出1
cout<<str1.find("ewo")<<endl;//输出8
return 0;
}
8.string类可以直接用><号比大小,为一个逻辑表达式,谁的开始元素的ASCII码大,谁就大,也就是所谓的字典序。这里不做过多赘述。我们来学习判断字符串是否为空的函数empty()
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("weishenmewozhemeshuai?");
cout<<str1.empty()<<endl;//输出0
str1="";
cout<<str1.empty()<<endl;//输出1
return 0;
}
9.然后是获取字符串长度(字符个数)(不算\0)的size()函数
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("I am so handsome!");
cout<<str1.length()<<endl;//17
cout<<str1.size()<<endl;//17
//哈哈,很吃惊吧,两个都是不算\0的有效长度
return 0;
}