1.string类简介
string是C++编程语言中的字符串。在C++中字符串处理可以使用c语言字符串形式char _,也可以使用string类格式。
  string 是一个类,类内有char _指针,通过容器方式管理字符串。使用string类型需要需要包含头文件string。

2.string类的构造函数
  string类提供了多种构造函数,支持无参构造、有参构造、拷贝构造。

1、无参构造:string()
2、有参构造:string(const char *str);
3、拷贝构造:string(const string &str);
4、初始化字符串为count个c字符:string(int count,char c);

使用示例:

#include < iostream >
#include < string >
using namespace std;
void test()
{
    string s1;//默认构造,即无参构造函数
    char const* str = "hello,world";//c语言字符串
    string s2(str);//传入C语言字符串
    cout << "s2=" << s2 << endl; 
}

3.string类赋值相关函数
  string类中提供”=”运算符重载和assign()全局函数进行赋值操。这两种方式均有多个重载版本,如下所示:

string字符串赋值:
  string &operator=(const char _s);//将c字符串赋给string
  string &operator=(const string &s);//将s赋值给string
  string &operator=(char c);//将字符c赋给string
全局函数:
  string &assign(const char _s);//将c字符串赋给string
  string &assign(const char *s,int n);//将c字符串前n个赋给string
  string &assign(const string &s);//将s赋给string
  string &assign(int n,char c);//将n个c赋给string

使用示例:

#include < iostream >
using namespace std;
#include < string >
void test()
{
    string s1="hello,world";//c语言字符串赋值
    cout << "s1=" << s1 << endl;
    string s2 = s1;//将s1赋给s2
    cout << "s2=" << s2 << endl;
    string s3 ;//单个字符赋给string
    s3 = 'c';
    cout <<"s3="<< s3 << endl;
    //全局函数赋值
    s1=assign("c++赋值测试");
    cout<<"s1="<<s1<<endl;
    s2=assign(s1,5);//将s1的前5个字符赋给s2
    s3=assign(s1);//将s1赋给s3
    string s4=assign(10,'a');
}

4.string类字符串拼接
  string类中字符串拼接有重载”+=”运算和全局函数append方式,均有多种重载版本。

运算符重载
  string &operator+=(const char _s);将s追加到string
  string &operator+=(const string &str);//将str追加到string
  string &operator+=(const char c);//将字符c追加到string
全局函数append
  string &append(const char _s);//将s追加到string
  string &append(const char *s,int n);//将s的前n个追加到string
  string &append(const string &str);//等价于operator+=(const string &str)
  string &append(const string &str,int pos,int n); —从str的第pos位置开始,取出n个字符追加到string中

使用示例:

void test()
{
    //+=运算符重载示例
    string s1 = "C++";
    s1 += "学习";
    s1 += ',';
    cout << "s1=" << s1 << endl;
    string s2 = "学习使我快乐!";
    s1 += s2;
    cout << "s1=" << s1 << endl;
    //append示例
    string s3;
    s3 = "C++";
    s3.append("学习");

    s3.append(s2,4);//从s2的第4个字符开始,将s2的字符拼接到s3
    cout << "s3=" << s3 << endl;
    s3.append(s2, 4,4);
    cout < < "s3=" << s3 << endl;//从s2的第4个字符开始,将s2的接下来4个字符拼接到s3
    s3.append("月入过万!");
    cout < < "s3=" < < s3 << endl;
    s3.append("我的未来不是梦",4,10);//从第4个位置开始截取10个字符拼接到s3
    cout < < "s3=" << s3 << endl;
}
int main()
{
    test();
    system("pause");
}


5.字符串查找与替换
  string字符串查找有find、rfind函数。

find函数是从左往右查找,查找成功返回第一个出现的下标,失败返回-1。
rfind是查找最后一个出现的下标,失败返回-1。 replace函数实现字符串替换。

//find函数:从左往右查找
返回值:查找成功返回出现的位置,失败返回-1
int find(const string&str,int pos=0)const;//形参pos表示开始查找的起始位置
int find(const char *str,int pos=0)const;
int find(const char *str,int pos=0,int n)const;//从str的第pos开始的前n个字符中str出现的位置
int find(const char c,int pos=0);//查找字符c
//rfind函数:从右往左查找
int rfind(const string &str,int pos=npos);从pos位置开始查找str最后一次出现的位置
int rfind(const char *str,int pos=npos);从pos位置开始查找str最后一次出现的位置
int rfind(const char *str,int pos=pos,int n);从pos开始的前n个字符中str最后一次出现的位置
int rfind(const char c,int pos=0);//查找c最后一次出现的位置
//字符串替换
string &replace(int pos,int n,const string &s);//将字符串的第pos位置开始的n个字符替换成s
string &replace(int pos,int n,const char *s);

使用示例:

#include < iostream >
#include < string >
using namespace std;
void test()
{
    string str = "1asd3as456asd4789asd";
    int pos = str.find("asd");//查找asd第一次出现的位置
    cout << "pos=" << pos << endl;
    string temp = "asd";
    pos = str.find(temp,7);//从第7个位置开始查找asd出现的位置
    cout << "pos=" << pos << endl;

    pos = str.rfind(temp);//查找最后一次出现的位置
    cout << "pos=" << pos < < endl;
    pos = str.rfind("asd",7,2);//从第3个位置开始往前查找,查找"asd"中的前2个字符在str中最后一次位置
    cout << "pos=" << pos << endl;
    //字符串替换
    str.replace(1, 7, "c++");//从第一个位值开始将str的7个字符替换为c++
    cout << "str=" << str << endl;
}
int main()
{
    test();
    system("pause");
}


6.字符串比较
  string类中字符串比较函compare数有多个重载版本,既可以和C语言风格const char *字符串进行比较,也可以和string类字符串进行比较。相等返回0,不相等返回0值。

字符串比较:
int compare(const char *str);//相等返回0,否则返回非0值
//比较string的len个字符,从idx位置开始
int string::compare (size_type idx, size_type len, const string& str) const
//从指定位置指定长度开始比较
int string::compare (size_type idx, size_type len, const string&str, size_type str_idx, size_type str_len) const

使用示例:

#include < iostream >
using namespace std;
#include < string >
void test()
{
    string str1 = "hello,world";
    if (str1 == "hello,world")
    {
        cout << "[const char *]相等" << endl;
    }
    string str2 = "hello,world";
    if (str1 == str2)
    {
        cout << "[string]相等" << endl;
    }
    if (!str1.compare("hello,world"))
    {
        cout << "[compare]相等" << endl;
    }
    //比较str1的前6个字符
    int ret=str1.compare(0,6,"hello,");
    cout << "ret=" << ret << endl;
    //从str1的第0个开始开始取出6个字符,
    //从"c++,hello,"的第4个位置开始,取出6个字符进行比较
    ret = str1.compare(0, 6, "c++,hello,", 4, 6);
    cout << "ret=" << ret << endl;
}
int main()
{
    test();
    system("pause");
}
```![](https://guyueju.oss-cn-beijing.aliyuncs.com/Uploads/Editor/202308/20230828_83149.jpg)

**7.string字符串以字符方式读写**
  string类字符串使用字符方式访问,可以使用重载"[]"版本函数,即可以和C语言中访问方式一样,也可以使用函数at来访问。
  string类中对于字符串的长度获取,可以使用size()函数或者length()函数来实现。

```cpp
string以字符方式访问
    char &operator[](int n);
    char &at(int n);
string 中获取字符串长度
    str.size();
    str.length();

使用示例:

#include < iostream >
#include < string >
using namespace std;
void test()
{
    string str = "hello,world";
    cout << "str长度:" << str.size() << endl;
    cout << "str长度:" << str.length() << endl;
    //修改成员
    for (int i = 0; i < str.size(); i++)
    {
        str[i] = i+'0';
    }
    //遍历
    for (int i = 0; i < str.size(); i++)
    {
        cout << str.at(i) << " ";
    }
    cout << endl;
}
int main()
{
    test();
    system("pause");
}

8.string字符串的插入与删除
string类中插入函数insert支持多种插入方式,有多个重载版本。
  字符串删除可以使用erease函数实现。

c++插入:
string& insert(int pos,const char *s);//从第pos位置开始插入s
string& insert(int pos,const string &s);

string &insert(int p0, const char *s, int n);//从p0位置开始插入s,插入的s连续n个字符
string &insert(int p0,const string &s, int pos, int n);//从p0位置开始插入s,插入的s从pos开始,连续n个字符

string &insert(int p0, int n, char c);//从p0处插入n个字符c

c++删除字符串
string &erase(int pos,int n=npos);//从pos位置开始删除n个字符

使用示例:

#include < iostream >
#include < string >
using namespace std;
void test()
{
    string str = "hello,";
    str.insert(2,"aaa");//从第2个位置开始插入aaa
    cout < < "str=" << str << endl;
    str.insert(4, "1234", 1, 2);//从第4个位置插入,从"1234"的第1个位置开始,连续两个字符插入到str中
    cout << "str=" << str << endl;

    //字符串删除
    str.erase(2,4);//从第2个位置开始,删除4个字符
    cout << "str=" << str << endl;
    str.erase();//清空字符串
    cout < < "str=" << str <<"\t长度:"<< str.size()<<endl;


9.子字符串提取
  string类中对于子字符串的提取,可以使用函数substr实现。
  判断string类字符串是否为空,即长度是否为0可以使用empty函数实现。

//子字符串提取
string substr(int pos=0,int n=npos)const;//从pos位置提取n个子字符
//判断字符串是否为空
bool empty();

使用示例:

#include <iostream>
#include <string>
using namespace std;
void test()
{
    string str="123456asd12";
    string temp=str.substr(6,3);//从下标6位置提取3个字符
    cout<<"temp="<<temp<<endl;
    string str2;
    if(str2.empty())
    {
        cout<<"字符串为NULL"<<endl;
    }
    else
    {
        cout<<"字符串不为NULL"<<endl;
    }
    if(str2=="")
    {
        cout<<"字符串为NULL"<<endl;
    }
}
int main()
{
    test();
    system("pause");
}


10.string类转换为char *
  将string字符串转换为char *字符串,可以使用c_str函数实现。

const char *c_str();
const char *data();
在c11版本之后,这两个函数功能一致,都是将string类型字符串转换成char *,返回一个char *字符串,以'\0'结尾。

使用示例:

#include < iostream >
#include < string >
using namespace std;
int main()
{
    string str = "hello,world";
    const char* p = str.c_str();
    cout << "p=" < < p << endl;
    p = str.data();
    cout << "p=" << p << endl;
    system("pause");
}