-
字符串类概念
C语言中每新建一个数组都要标明下标,以方便分配内存;或使用指针,但不能进行插入替换等操作。故C++引入String类,以方便进行字符串的各种操作及存储。
字符串的头文件
#include<string>
-
字符串类的创建及初始化
-
初始化的三种方式
字符串创建有三种方式,可以赋值或拷贝
string s1;
string s2("tryre");//将tryre拷贝到s2
string s3(s2);//将s2拷贝到s3
string s4 = "ruytr";//将ruytr赋值到s4
//赋值运算符重载(类中重载)
string s5(s2,1,3);//引入三个量:拷贝本体、开始下标、长度
//pos-->1 len-->3 pos:从0开始的下标 len:长度
//ryr给s5
string s6(s2,3);//引入两个量:拷贝本体、长度
//try给s6
可通过cplusplus.com来查询string重载类型
string s6(s2.begin(),s2.end());
//begin-->t,end-->e的下一个位置
//返回值迭代器
string s7(s2.begin(), s2.begin()+4);
cout << s7 << endl;//左闭右开取tryr
s7中的s2.begin()+4代替了s2.end()的位置,所以是开区间
eg:[1,7)-->123456
-
读取
cout << s2[2] << endl;//取大数会越界,但程序不会停
//不检测越界,数据不安全,会读到其他地方
//读越界数程序不报错
cout << s2.at(2) << endl;//at()函数,检测越界
//at()函数安全,不会读到其他地方
//读越界数程序报错,相对安全
-
插入数据
有insert、append(追加)、+(在string中重载运算符+,使其变为连接作用)三种类型
//插入
s2.insert(1, "uuu");//插入用insert:俩参数(第几个位置插入几)
//中间插
cout << s2 << endl;
//tuuuryre
s2.append("ww");//追加,往后加
//后面插
cout << s2 << endl;
//tuuuryreww
s2 = s2 + "kk";//连接,往后连接
//重载+
cout << s2 << endl;
//tuuuryrewwkk
在string类中insert的重载
-
替换数据
//替换
s2.replace(4,3,"ccc");//仨参数pos,len,替换的东西
//还可以用迭代器
cout << s2 << endl;
-
求子串
//求子串
s2.substr(4,3);//俩参数pos,len
cout << s2 << endl;
-
比较大小
比较的是字符串的ASCll码值
//比较大小
cout << (s2 > s4);
-
字符串的查询和删除
-
查询
查询结果是返回下标,结果输出应为整型
string str = "how are you";
int n = str.find("are");
//输出为a的地址
//查找返回下标是整型
int n = str.find("l");
//有l就返回l所对应的下标
//没有就返回-1,因为下标都是大于等于0 -->npos
//若用迭代器,则返回为空,结束迭代器为空
int n = str.find("o", 5);
//从第五个后查到o
//返回第五个后遇到的第一个o的地址
//返回第一个与指定字符串中任意一个字符匹配的位置
int n = str.find_first_of("abc");//从开始查找与abc任意一个相同的位置
//3
int n = str.find_last_of("abc");
int n = str.find_first_not_of("abc");
int n = str.find_last_not_of("abc");
cout << n << endl;
string类中find的重载
-
删除
//删除
str.erase(0, 4);
//pos len 表示删除从pos地址开始的len个单位的字符
//输出结果为are you
str.erase(1);
//pos pos默认npos 表示从1以后都删
cout << str << endl;
string str1 = "how are you";
str.erase(str1.begin() + 1);//hw are you
//迭代器起始迭代器表示闭着的,所以表示从0+1开始
str.erase(str1.begin(), str1.end() - 3);//只剩u
//起始迭代器表示闭着的,结束迭代器表示开着的,本身是h到用,但因为结束迭代器指往后一位,所以到
cout << str1 << endl;
要注意起始迭代器和结束迭代器定义的差别
用查找返回下标
//删除字符串两段空格
void test3()
{
string s = " how are you ";
s.erase(0,s.find_first_not_of(" "));//pos len
//s.find_first_not_of(" ")返回下标,表示len不需要+-1
s.erase(s.find_last_not_of(" ") + 1);//npos删掉后面所有
cout << s << endl;
}
-
字符串与其他类型的转换
//字符串与其他类型的转换
//用字符串流解决
//n(内存)<--写,输出--字符串流(内存,看成txt)--读,输入-->s(内存)
void test4() {
//整型转字符串
int n = 8;
string s;
stringstream it;
it << n;//写入字符串流,输出
it >> s;//读,输入
cout << s << endl;
//字符串转整型
string s1 = "567";
int n1;
stringstream ip;//派生类(可读可写)
ip << s1;//写入字符串流,输出
ip >> n1;//读,输入
cout << n1 << endl;
}
-
拆分字符串
//拆分字符串
void test5()
{
//空格,换行做分隔符
string str("how are you");
string s;
//输入流
istringstream in(str);
while (!in.eof())//读到流的结束
{
in >> s;
cout << s << endl;
}
//逗号做分隔符
string str1("how,are,you");
istringstream in1(str1);
while (!in1.eof())//读到流的结束
{
getline(in1,s,',');//getline传三个参
cout << s << endl;
}
}
-
总结
- 字符串类的初始化有赋值和拷贝两种方法
- 读取注意使用at函数防止越界
- 常见的插入数据有有insert、append(追加)、+(在string中重载运算符+,使其变为连接作用)三种类型
- 替换用replace,传三个参(pos,len,替换数据)
- 求子串用substr(pos,len)
- 查询返回类型是int型,查不到就返回-1
- 删除注意迭代器表示的大小
- 拆分字符串若不以空格或换行为界限,则用getline函数重新定义拆分符号