17.6字符串类
字符串类string是不同于字符数组的字符串处理方式。使用字符串类,需要包含以下头文件:
#include<string>
在学习过程中,必须分清楚string类和字符数组处理字符串的异同。
17.6.1 字符串类:输入输出(cin/cout)
可以使用cin和cout来读写string类型。
使用cin读入string类型,会忽略开头的制表符、换行符、空格,当再次碰到这类字符就停止(并不会读取这类字符)。
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
int total=0;
while(cin>>s){
total++;
cout<<total<<" "<<s<<endl;
}
return 0;
}
17.6.2 字符串类:读取(getline)
读取包含空格类字符的一行。
getline(cin,s);
其中,s是字符串类的对象。
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
int total=0;
while(getline(cin,s)){
total++;
cout<<total<<" "<<s<<endl;
}
return 0;
}
17.6.3 字符串类:构造string对象和初始化
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;//空串
string s1="hello,hhh";//初始化为hello,hhh
string s2("OK");//初始化为"OK"
string s3(s1);//用s1初始化s3
string s4(4,'c');//初始化为4个字符c
cout<<s<<endl;
cout<<s1<<endl;
cout<<s2<<endl;
cout<<s3<<endl;
cout<<s4<<endl;
return 0;
}
17.6.4 字符串类:string类字符元素的访问
s[i]返回s索引i处字符的引用,不查是否出界
s.at(i)返回索引处i处字符的引用,检查出界
#include<iostream>
#include<string>
using namespace std;
int main(){
string s="hello,hhh";
cout<<s[1]<<" "<<s.at(4)<<endl;
cout<<s[20]<<endl;
cout<<s.at(20)<<endl;
return 0;
}
17.6.5 字符串类:重载运算符
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1;
string s2;
s1="hh";
s2=s1;//s2成为s1的拷贝
cout<<s2<<endl;
s1+=s2;//s2的字符数据连接到s1的尾部
cout<<s1<<endl;
cout<<s1+s2<<endl;//将s2连接到s1的尾部,s1不变
//基于字典序的比较,返回布尔值
cout<<(s1==s2)<<endl;
cout<<(s1!=s2)<<endl;
cout<<(s1<s2)<<endl;
cout<<(s1>s2)<<endl;
cout<<(s1<=s2)<<endl;
cout<<(s1>=s2)<<endl;
return 0;
}
17.6.6 字符串类:常用成员函数
length() 求长度
size() 求长度
empty() 判断字符串是否为空
substr() 求子串
erase() 删除若干字符串
insert() 插入字符
replace() 替换字符
find系列函数 查找子串
1.求长度函数length/size
#include<iostream>
#include<string>
using namespace std;
int main(){
string s="hello,hhh";
cout<<s.length()<<endl;
cout<<s.size()<<endl;
return 0;
}
2.判断空串函数empty
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1="hello,hhh";
string s2="";
cout<<s1.empty();
cout<<s2.empty();
return 0;
}
1. 求子串函数substr
返回从pos开始的len个字符组成的字符串
#include<iostream>
#include<string>
using namespace std;
int main(){
string s="hello,h1h2";
string s1=s.substr(2);
string s2=s.substr(2,3);
cout<<s1<<endl<<s2;
return 0;
}
4.删除字符函数erase
删除pos开始的n个字符,返回修改后的字符串。源字符串也被修改。
#include<iostream>
#include<string>
using namespace std;
int main(){
string s="hello,h1h2";
string s1=s.erase(6);
string s2=s.substr(1,2);
cout<<s1<<endl<<s2;
return 0;
}
1. 插入字符函数insert
#include<iostream>
#include<string>
using namespace std;
int main(){
string s=",";
s.insert(0,"heo");//从第0个位置,插入字符串
cout<<s<<endl;
s.insert(4,"world",2);//从第4个位置,插入字符串的前2个字符
cout<<s<<endl;
s.insert(2,2,"l");//从第2个位置,插入2次字符'l'
cout<<s<<endl;
s.insert(s.end(),"r");//在末尾插入字符'r'
cout<<s<<endl;
s+="ld!";//在末尾插入字符串
cout<<s<<endl;
return 0;
}
1. 替换字符函数replace
#include<iostream>
#include<string>
using namespace std;
int main(){
string s="hello,world";
//删除第7个字符后的6个字符,以"hh1"代替
s.replace(7,6,"hh1");
cout<<s<<endl;
//删除第7个字符后3个字符,以"h2222h2"前6个字符代替
s.replace(7,3,"h2222h2",6);
cout<<s<<endl;
//删除第7个字符后的6个字符,以3个z字符代替
s.replace(7,6,3,'z');
cout<<s<<endl;
return 0;
}
1. 查找系列函数find
找字串:
find:从前往后找
rfind:从后往前找
找到第一个或者最后一个出现在某个字符串中的字符:
find_first_of
find_first_not_of
find_last_of
find_last_not_of
#include<iostream>
#include<string>
using namespace std;
int main(){
string s="hello,world!";
string f=",!";
cout<<s.find('l',1)<<endl;//从第1个开始查找字符'l'的首次出现
cout<<s.find("lo",7)<<" "<<string::npos<<endl;//字串的首次出现,不存在返回string::nops
cout<<s.rfind("lo",1)<<endl;//往前查找
cout<<s.find_first_of(f,2)<<endl;//从第2个位置开始查找在字符串f中的字符
cout<<s.find_last_of(f)<<endl;//从后面开始查找在字符串f中的字符
cout<<s.find_first_not_of(f)<<endl;//从开始查找不在字符串f中的字符
cout<<s.find_last_not_of(f,100)<<endl;//从后面开始查找不在字符串f中的字符
return 0;
}