目录
概述:
string其实是一个类。string容器在头文件<string>中,用来保存字符串,其容器内每个字符都是char*类型的。
创建方式:
有四种常见的创建方式:直接定义(默认初始化为空)。运用const char*类型来初始化。复制其他的字符串(地址不同)。string(int n, char c);使用n个字符c来初始化字符串(在创建并初始化时才能用)。
//第一种
string s1; //等同于 string s4 = "";
cout << s1 << endl;
cout << &s1 << endl;
//第二种,其实就是用const char*来初始化
string s2("Hello");
cout << s2 << endl;
cout << &s2 << endl;
/*//这种和第二种是一样的
const char* a = "hello";
string s2(a);*/
//第三种,复制其他的字符串
string s3 = s2;
cout << s3 << endl;
cout << &s3 << endl;
//第四种,使用3个字符s来初始化字符串
string s4(3, 's');
cout << s4 << endl;
cout << &s4 << endl;
常用函数方法:
assign,赋值函数
assign用于给string赋值。assign有多个重载,一:assign(const char* c);就是将c赋给string(和“=”相同作用)。二:assign(const char* c, int k);将c的前k个字符赋给string(若第二个参数大于c的长度,则将c赋给string,但这时调用length函数会获取到k而不是c的长度)。三:assign(int n, char c); 将n个字符c赋给string。
string s1;
s1.assign("Hello World");
cout << s1 << " s1的长度为:" << s1.length() << endl;
s1.assign("Hello World", 5);
cout << s1 << " s1的长度为:" << s1.length() << endl;
//第二个参数大于第一个参数的长度
s1.assign("Hello World", 20);
cout << s1 << " s1的长度为:" << s1.length() << endl;
s1.assign(6, 's');
cout << s1 << " s1的长度为:" << s1.length() << endl;
append,拼接函数
append用于在字符串后方拼接字符串,它有多个重载函数。一:append(const char* c)与append(string &s),这两个效果相同,都是直接将字符串c(s)拼接到后面。二:append(const char* c, int k)将c的前k个字符拼接到字符串后面(若第二个参数大于c的长度,则将c赋给string,但这时调用length函数会发现字符串长度比原来大k而不是c的长度)三:append(const char* c, int pos, int n);将c的从pos开始,一共n个字符添加到字符串后面。
string s1("Hello ");
cout << s1 << " s1的长度为:" << s1.length() << endl;
s1.append("World", 3);
cout << s1 << " s1的长度为:" << s1.length() << endl;
string s2("Hello ");
s2.append("World", 8);
cout << s2 << " s2的长度为:" << s2.length() << endl;
string s3("Hello ");
s3.append("World", 1, 3);
cout << s3 << " s3的长度为:" << s3.length() << endl;
find、rfind、replace,查找与替换
find默认查找第一次出现的位置、rfind(Reverse Find)默认查找最后一次出现的位置,找到了会返回位置(从0开始),没找到会返回-1。replace替换字符串。
find
find(const char c, int pos = 0),从s【pos】开始寻找字符c。find(const char* c, int pos = 0);从s【pos】开始寻找c。find(const char* c, int pos, int n);从s【pos】开始寻找c的前n个字符第一次出现的位置(若n大于c的长度,则找不到,返回-1)。find(string &s1, int pos = 0),从s【pos】开始寻找s1。
string s1("Hello ");
cout << s1 << " s1的长度为:" << s1.length() << endl;
const char c1 = 'l';
int k = s1.find(c1);
cout << k << endl;
//从s1【2】开始查找c2
const char* c2 = "l";
k = s1.find(c2, 2);
cout << k << endl;
//从s1【3】开始查找c2
k = s1.find(c2, 3);
cout << k << endl;
//从s1【3】开始查找c2前1个字符
k = s1.find(c2, 3, 1);
cout << k << endl;
string s2 = "lo";
k = s1.find(s2);
cout << k << endl;
rfind
注:下方的npos表示字符串s1的最后一个下标
rfind(const char c, int pos = npos);从s1【npos】开始向前寻找第一次出现c的下标。rfind(const char* c, int pos = npos);从s1【npos】开始向前寻找第一次出现c的下标。(若输入的第二个参数大于npos,则默认为npos)。rfind(const char* c, int pos, int n);从s1【pos】开始向前寻找c的前n个字符第一次出现的位置(若n大于c的长度,则返回-1.)。rfind(string &s2, int pos = npos);从s1【npos】开始向前寻找第一次出现s2的下标。
string s1("Hello ");
cout << s1 << " s1的长度为:" << s1.length() << endl;
//第二个参数不写则从最后向前查找。
const char c1 = 'l';
int k = s1.rfind(c1);
cout << k << endl;
//从s1【10】(其实是s1【5】)开始向前查找c2
const char* c2 = "l";
k = s1.rfind(c2, 10);
cout << k << endl;
//从s1【3】开始向前查找c2
k = s1.rfind(c2, 3);
cout << k << endl;
//从s1【12】开始向前查找c2前1个字符
k = s1.rfind(c2, 12, 1);
cout << k << endl;
string s2 = "lo";
k = s1.rfind(s2);
cout << k << endl;
replace
replace(int pos, int n, const string &s2)、replace(int pos, int n, const char* c);将从s1【pos】开始的n个字符串替换为s2(c)。若n+pos大于s1的长度,则会将s1【pos】开始的所有字符串都替换为s2(c)。
string s1("Hello ");
cout << s1 << " s1的长度为:" << s1.length() << endl;
const char* c = "iittt";
s1.replace(2, 3, c);
cout << s1 << " s1的长度为:" << s1.length() << endl;
//10+2(n+pos) > 6(s1的长度)
string s2 = "llo";
s1.replace(2, 10, s2); //此时si的长度变为5而不是6
cout << s1 << " s1的长度为:" << s1.length() << endl;
字符串比较
compare用于比较两个字符串之间的ASCII值,它是从左往右一个字符一个字符地比较,若s1【i】大于s2【i】,返回1;若s1等于s2,则进行下一个字符比较,若全相等,返回0;若s1小于s2,返回-1。注意,string类型 可以用“==”比较是否相同,但char类型的不行。
string s1("Hbaaa");
cout << s1 << " s1的长度为:" << s1.length() << endl;
string s2("Hazzz");
cout << s2 << " s2的长度为:" << s2.length() << endl;
cout << s1.compare(s2) << endl;
获取单个字符
at函数,返回值是一个char类型的字符。用法与"[]"相同。
string s1("Hello");
cout << s1 << " s1的长度为:" << s1.length() << endl;
char c = s1.at(1);
cout << "s1第二个字符为:" << c << endl;
s1.at(2) = 'a';
cout << s1 << " s1的长度为:" << s1.length() << endl;
字符串的插入与删除
string通过insert插入,erase删除。insert(int pos, string &s2)、insert(int pos, const char* s2);在s1【pos】处插入s2。insert(int pos, int n, char c);在s1【pos】处插入n个字符c。erase(int pos, int n = npos);删除从s1【pos】开始的n个字符(没有第二个参数或者第二个参数大于等于s1在pos后面的字符数,删除从s1【pos】开始的所有字符)。
string s1("Hello");
cout << s1 << " s1的长度为:" << s1.length() << endl;
//从s1【1】处插入c1
const char* c1 = "1111";
s1.insert(1, c1);
cout << s1 << " s1的长度为:" << s1.length() << endl;
//从s1【2】处插入s2
s1 = "Hello";
string s2 = "2222";
s1.insert(2, s2);
cout << s1 << " s1的长度为:" << s1.length() << endl;
//从s1【3】处插入4个c2
s1 = "Hello";
const char c2 = '3';
s1.insert(3, 4, c2);
cout << s1 << " s1的长度为:" << s1.length() << endl;
//从s1【3】开始,删除4个字符
s1.erase(3, 4);
cout << s1 << " s1的长度为:" << s1.length() << endl;
//从s1【2】开始,删除100个字符(后面没有100个,所以和没有第二个参数同个功能)
s1.erase(2, 100);
//同 s1.erase(2);
cout << s1 << " s1的长度为:" << s1.length() << endl;
获取字符串中的子串
substr (sub-string:子字符串)。substr(int pos);获取从s1【pos】开始的所有字符组成的字符串。substr(int pos, int n);获取从s1【pos】开始的n个字符组成的字符串(若pos+n大于s1的长度,则效果同没有第二个参数)。
string s1("Hello");
cout << s1 << " s1的长度为:" << s1.length() << endl;
string s2 = s1.substr(1);
cout << s2 << " s2的长度为:" << s2.length() << endl;
s2 = s1.substr(1, 2);
cout << s2 << " s2的长度为:" << s2.length() << endl;
s2 = s1.substr(2, 7);
cout << s2 << " s2的长度为:" << s2.length() << endl;