Loading... # string 容器的基本概念 C风格字符串(以空字符结尾的字符数组)太过于复杂,不适合大程序的开发,所以C++标注库定义了一种string类,定义在头文件。 * string 和 c风格字符串对比: <div class="tip inlineBlock share"> 1. char *是一个指针,string 是一个类 2. string 封装char,管理这个字符串,是一个char型的容器。 3. string 封装了很多实用的成员方法 4. 查找find、拷贝copy、删除delete、替换replace、插入insert 5. 不用考虑内存释放和越界 6. string 管理char* 所分配的内存。每一次string的复制,取值都由string类复制维护,不用担心复制越界和取值越界。 </div> # string常用操作 ## string 构造函数 > * string();//创建一个空的字符串 例如 string str; > * string(const string& str);//使用一个string 对象初始化另一个string 对象 > * string(const char* s);//使用字符串s 初始化 > * string(int n, char c);//使用n 个字符c 初始化 v ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str; string str1("hello"); string str2(str1); string str3(5, 'k'); cout << "str1 = " << str1 << endl; cout << "str2 = " << str2 << endl; cout << "str3 = " << str3 << endl; return 0; } ``` ![](https://blog.fivk.cn/usr/uploads/2021/04/2956183892.png) ## string 基本赋值操作 > * string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串 > * string& operator=(const string &s);//把字符串s赋给当前的字符串 > * string& operator=(char c);//字符赋值给当前的字符串 > * string& assign(const char *s);//把字符串s赋给当前的字符串 > * string& assign(const char *s, int n);//把字符串s的前n个字符赋给当前的字符串 > * string& assign(const string &s);//把字符串s赋给当前字符串 > * string& assign(int n, char c);//用n个字符c赋给当前字符串 > * string& assign(const string &s, int start, int n);//将s从start开始n个字符赋值给字符串 ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str1("heihei"); cout << "str1 = " << str1 << endl << endl; string str("hello world!"); cout << "str(“hello world!”) = " << str << endl; str = str1; cout << "(str = str1) = " << str << endl; str = "hehe"; cout << "(str = “hehe”) = " << str << endl; str = 'c'; cout << "(str = 'c') = " << str << endl; str.assign(str1); cout << "(str.assign(str1)) = " << str << endl; str.assign("hahahhh"); cout << "(str.assign(“hahahhh”)) = " << str << endl; str.assign("jack", 2); cout << "(str.assign(“jack”, 2)) = " << str << endl; str.assign(5, 'c'); cout << "(str.assign(5, 'c')) = " << str << endl; str.assign(str1, 2, 3); cout << "str.assign(str1, 2, 3) = " << str << endl; return 0; } ``` ![](https://blog.fivk.cn/usr/uploads/2021/04/311032851.png) ## string的存取字符操作 > char& operator[](int n);//通过[]方式取字符 > char& at(int n);//通过at方法获取字符 ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str("hello world!"); cout << str[4] << endl;//输出第5个字符 str[4] = 'c'; //修改第5个字符 cout << str.at(4) << endl; //输出第5个字符 return 0; } ``` ## string 拼接字符操作 > string& operator+=(const string& str);//重载+=操作符 > string& operator+=(const char* str);//重载+=操作符 > string& operator+=(const char c);//重载+=操作符 > string& append(const char *s);//把字符串s连接到当前字符串结尾 > string& append(const char *s, int n);//把字符串s的前n个字符连接到当前字符串结尾 > string& append(const string &s);//同operator+=() > string& append(const string &s, int pos, int n);//把字符串s中从pos开始的n个字符连接到当 ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str1("hello"); string str2(" world!"); cout << "str1 = " << str1 << endl; cout << "str2 = " << str2 << endl; str1 += str2; cout << "(str1+=str2) = " << str1 << endl; cout << "str1+=“ Fivk” = " << (str1 += " Fivk") << endl; cout << "str1.append(str2) = " << (str1.append(str2)) << endl; str2 = "Fivk"; cout << "str2.append(“ haha”,2) = " << str2.append(" hehe", 2) << endl; str2 = "Fivk"; cout << "str2.append(“ haha”,2,5) = " << str2.append(" hehe", 5) << endl; str2 = "Fivk"; cout << "str2.append(“ haha”,2,5) = " << str2.append(6, 'h') << endl; return 0; } ``` ## string 查找和替换 > int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找 > int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找 > int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置 > int find(const char c, int pos = 0) const; //查找字符c第一次出现位置 > int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,从pos开始查找 > int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找 > int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置 > int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置 > string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str > string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str1("hello world!"); string str2("wor"); //一、int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找 cout << "str1.find(str2) = " << str1.find(str2) << endl; cout << "str1.find(str2, 3) = " << str1.find(str2, 3) << endl; //返回的是str1中首次出现str2的位置,和C语言中的strstr函数差不多 //没有第二个int型参数默认参数为0,从头开始找 //二、int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找 cout << "str1.find(“wor”) = " << str1.find("wor") << endl;//这个是一样的 //三、int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置 cout << "str1.find(“ldjakfjsd”, 0, 2) = " << str1.find("ldjakfjsd", 0, 2) << endl; //这里第三个字符填的是2,所以只查找 ldjakfjsd 中的前两个即ld //四、int find(const char c, int pos = 0) const; //查找字符c第一次出现位置 cout << "str1.find('o',0) = " << str1.find('o', 0) << endl; //这里第二个参数一样可以不写 //重点!!!:再find前面加r就表示从友往左寻找,即表示最后一次出现的位置 //五、int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,从pos开始查找 str2 = "122 aksjfklads 122 klajfkljd 122adjfjd"; cout << "str2.rfind(“122”) = " << str2.rfind("122") << endl; //其他只要是查找的find都可以添加r //六、string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str str2 = "123456789"; str1 = "abcdefg"; str1.replace(2, 4, str2);//这里第三个参数可以是字符串常量 cout << "str1.replace(2, 4, str2) = " << str1 << endl; return 0; } ``` ## string 比较操作 > compare函数在>时返回 1,<时返回 -1,==时返回 0。 > 比较区分大小写,比较时参考字典顺序,排越前面的越小。 > 大写的A比小写的a小。 > int compare(const string &s) const;//与字符串s比较 > int compare(const char *s) const;//与字符串s比较 ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str1("hello"); string str2("hello"); string str3("world"); cout << "str1.compare(str2) = " << str1.compare(str2) << endl; cout << "str1.compare(str3) = " << str1.compare(str3) << endl; //原理和C语言的strcmp函数一样 //同样可以以字符串常量作为参数 return 0; } ``` ## string 子串 > string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串 ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str("helloworld"); string str1 = str.substr(4, 3); cout << str1 << endl; return 0; } ``` ## string 插入和删除操作 > string& insert(int pos, const char* s); //插入字符串 > string& insert(int pos, const string& str); //插入字符串 > string& insert(int pos, int n, char c);//在指定位置插入n个字符c > string& erase(int pos, int n = npos);//删除从Pos开始的n个字符 ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str1("helloworld"); string str2("hehe"); //一、string& insert(int pos, const char* s); //插入字符串 str1.insert(1, str2);//第二个参数可以是字符串常量 cout << "str1 = " << str1 << endl; //二、string& insert(int pos, int n, char c);//在指定位置插入n个字符c str1 = "12345"; str1.insert(2, 10, 'r'); cout << "str1.insert(2, 10, 'r')" << str1 << endl; //三、string& erase(int pos, int n = npos);//删除从Pos开始的n个字符 str1.erase(2, 5); cout << "str1.erase(2,5)" << str1 << endl; return 0; } ``` ## string 和c-style 字符串转换 > //string 转 char* > > string str = "itcast"; > > const char* cstr = str.c_str(); > //char* 转 string > > char* s = "itcast"; > > string str(s); ```C++ #include<iostream> #include<cstring> using namespace std; int main() { string str("hello"); str = "world";//内部实现:str.operator(char*) char* s = NULL; //s = "world";//error 报错 //str.c_str(); //返回的是一个const char* s = const_cast<char*>(str.c_str());//const_cast<char*> 这个是强制转化为 去const类型 cout << s << endl; return 0; } ``` 最后修改:2021 年 04 月 13 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 2 如果觉得我的文章对你有用,请随意赞赏