1.本质
string是C++风格的字符串,本质上是一个类
2.与char*区别
string在内部封装了char*,是char*的容器
3.特点
string内部封装了很多成员方法;
string管理char*的内存,不用担心复制越界和取值越界,由类对它负责。
4.构造函数
1.分类
(3是拷贝构造)
2.代码演示
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
//默认构造
string s1;
//使用一个字符串进行初始化
string s2("hello world");
cout << s2 << endl;
//使用拷贝构造
string s3(s2);
cout << s3 << endl;
//使用n个字符进行初始化
string s4(10, 'a');
cout << s4 << endl;
return 0;
}
3.总结
这些构造函数没有可比性,灵活使用即可
4.赋值
1.函数原型
2.利用等号
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1;
s1 = "hello world";
cout << s1 << endl;
string s2;
s2 = s1;
cout << s2 << endl;
string s3;
s3 = 'a';
cout << s3 << endl;
return 0;
}
3.利用assign内置成员函数
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1;
s1.assign("hello C++");
cout << s1 << endl;
string s2;
s2.assign(s1);
cout << s2 << endl;
string s3;
//取s2的前5个
s3.assign(s2,5);
cout << s3 << endl;
string s4;
//将十个w组合在一起
s4.assign(10, 'w');
cout << s4 << endl;
return 0;
}
5.字符串拼接
1.功能
实现在字符串末尾拼接字符串
2.函数原型
3.使用+=进行追加
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abc";
//追加字符串
s1 += "def";
cout << s1 << endl;
//追加字符
s1 += 'g';
cout << s1 << endl;
string s2 = "奥里给";
//追加同类容器
s2 += s1;
cout << s2 << endl;
return 0;
}
4.使用内置成员函数append追加
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "I ";
//追加字符串
s1.append("love game ");
cout << s1 << endl;
string s2 = "LOL GTA ";
//追加类
s1.append(s2);
cout << s1 << endl;
string s3 = "wcnm";
//追加字符串的前两个个字符
s1.append("wcnm", 2);
//s1.append(s3, 2);
cout << s1 << endl;
//追加的第二个字符开始后的两个字符(从0开始计算的)
s1.append(s3, 2, 2);
cout << s1 << endl;
return 0;
}
注意:
s1.append(s3, 2);
不能将追加字符串前两个字符的代码写成这样,这样输出的结果是输出类中从第二个开始数知道结尾的字符(注意是从0开始计算的)(也就是不能省略参数,必须有三个参数,要不然会和另一个成员函数冲突)
(有看不懂的就去看函数原型)
6.查找和替换
1.函数原型
其实忽略掉重复的,只需要着重记下面几条就可以,然后额外补充一条replace
replace(first,last,str);
把以first开始(含),last结束(不含)的子串替换为str。其中first和last均为迭代器。
empty();
判断字符串是否为空,为空返回1,不为空返回0.
2.查找
1.find
查找字符串第一次出现的位置
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abcdefg";
int pos = s1.find("de");
cout << pos << endl;
return 0;
}
若成功找到,返回她第一次出现的位置(因为索引是从0开始的)
若没有找到返回-1
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abcdefg";
int pos = s1.find("df");
cout << pos << endl;
return 0;
}
2.rfind
与find区别:rfind是从右往左查找,find是从左往右查找
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abcdefgde";
int pos = s1.rfind("de");
cout << pos << endl;
return 0;
}
注意:虽然从右往左查,不过索引顺序还是按照从左往右的顺序,并且仍然是d的位置。
3.替换
作用:将从参数一开始的之后的参数二的这些字符替换成参数三
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abcdefgde";
s1.replace(1,3,"1111");
cout << s1 << endl;
return 0;
}
7.字符串比较
1.比较方式
根据ASCLL码来比较
=返回 0
>返回 1
<返回 -1
2.函数原型
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abc";
string s2 = "cbc";
if (s1.compare(s2) == 0)
{
cout << "s1 等于 s2" << endl;
cout << s1.compare(s2) << endl;
}
else if (s1.compare(s2) > 0)
{
cout << "s1 大于 s2" << endl;
cout << s1.compare(s2) << endl;
}
else if (s1.compare(s2) < 0)
{
cout << "s1 小于 s2" << endl;
cout << s1.compare(s2) << endl;
}
return 0;
}
注意:与C语言的字符串比较的原理相同
8.字符存取
1.函数原型
2.通过[]访问单个字符
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abcdefg";
for (int i = 0; i < size(s1); i++)
{
cout << s1[i] << " ";
}
cout << endl;
return 0;
}
注意:其中size(s1)计算的是s1的长度
3.通过at访问单个字符
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abcdefg";
for (int i = 0; i < s1.size(); i++)
{
cout << s1.at(i) << " ";
}
cout << endl;
return 0;
}
4.修改字符串的单个字符
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abcdefg";
s1[0] = 'b';
s1.at(1) = 'a';
cout <<s1<< endl;
return 0;
}
9.插入和删除
1.函数原型
2.插入
insert语法:在”第一个参数“个的字符前面插入“第二个参数”。
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "hello";
s1.insert(1, "111");
cout << s1 << endl;
return 0;
}
3.删除
erase语法:从“第一个参数”起,删除“第二个参数”个字符
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "h111ello";
s1.erase(1, 3);
cout << s1 << endl;
return 0;
}
10.子串获取
1.函数原型
2.代码实现
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
string s1 = "abcdefg";
string s2 = s1.substr(1, 3);
cout << s2 << endl;
return 0;
}
3.实用操作
从邮箱地址中获取用户名
#include<stdio.h>
using namespace std;
#include<string>
#include <iostream>
int main()
{
//从邮箱地址中获取用户名
string s1 = "17853400693@163.com";
int pos = s1.find("@");
string user = s1.substr(0,pos);
cout << user << endl;
return 0;
}