C++学习(18)—— string容器
1.string基本概念
本质:
- string是C++风格的字符串,而string本质上是一个类
string和char * 的区别:
- char*是一个指针
- string是一个类,类内部封装了char *,管理这个字符串,是一个char * 型的容器
特点:
string类内部封装了很多成员方法
例如:查找find,拷贝copy,删除delete,替换replace,插入insert
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
2.string构造函数
构造函数原型:
-
string();
//创建一个空的字符串,例如string str;string(const char* s);
//使用字符串s初始化 -
string(const string& str);
//使用一个string对象初始化另一个string对象 -
string(int n, char c);
//使用n个字符c初始化
#include<iostream>
#include<string>
using namespace std;
//string(); //创建一个空的字符串,例如string str;
//
//string(const char* s); //使用字符串s初始化
//
//string(const string& str); //使用一个string对象初始化另一个string对象
//
//string(int n, char c); //使用n个字符c初始化
void test01() {
string s1;
const char* str = "hello world";
string s2(str);
cout << "s2 = " << s2 << endl;
string s3(s2);
cout << "s3 = " << s3 << endl;
string s4(10, 'a');
cout << "s4 = " << s4 << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:string的多种构造方式没有可比性,灵活运用即可
3.string赋值操作
功能描述:
- 给string字符串进行赋值
赋值的函数原型:
string& operator=(const char*s);
//char*类型字符串 赋值给当前的字符串string& operator=(const string &s);
//把字符串s赋值给当前字符串string& operator=(char c);
//字符赋值给当前字符串string& assign(const char *s, int n);
//把字符串s的前n个字符赋值给当前字符串string& assign(const string &s);
//把字符串s赋值给当前字符串string& assign(int n, char c);
//把n个字符c赋值给当前字符串
#include<iostream>
#include<string>
using namespace std;
void test01() {
string s1;
s1 = "hello world";
cout << "s1 = " << s1 << endl;
const char* str = "hello world";
string s2;
s2 = s1;
cout << "s2 = " << s2 << endl;
string s3;
s3 = 'a';
cout << "s3 = " << s3 << endl;
string s4;
s4.assign("hello c++");
cout << "s4 = " << s4 << endl;
string s5;
s5.assign("hello c++", 5);
cout << "s5 = " << s5 << endl;
string s6;
s6.assign(5, 'a');
cout << "s6 = " << s6 << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:string的赋值方式很多,operator=
这种方式是比较实用的
4.string字符串拼接
功能描述:
- 实现在字符串末尾拼接字符串
函数原型:
string& operator+=(const char* str);
//重载+=操作符string& operator+=(const char c);
//重载+=操作符string& operator+=(const string& str);
//重载+=操作符string& append(const char* s);
//把字符串s连接到当前字符串结尾string& append(const char* s, int n);
//把字符串s的前n个字符连接到当前字符串结尾string& append(const string& s);
//同operator+=(const string& str)string& append(const string& str, int pos, int n);
//字符串s中从pos开始的n个字符连接到字符串结尾
#include<iostream>
#include<string>
using namespace std;
void test01() {
string s1 = "我";
s1 += "爱玩游戏";
cout << "s1 = " << s1 << endl;
s1 += ':';
string s2 = "DNF";
s1 += s2;
string s3 = "I";
s3 .append("love");
cout << "s3 = " << s3 << endl;
s3.append("game abcde", 4);
cout << "s3 = " << s3 << endl;
s3.append("abcd DNF", 5, 3);
cout << "s3 = " << s3 << endl;
}
int main() {
test01();
system("pause");
return 0;
}
注意:string& append(const string& str, int pos, int n);
从0开始计数
5. 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 = 0, 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个字符为字符串strstring& replace(int pos, int n, const char*s);
//替换从pos开始的n个字符为字符串s
#include<iostream>
#include<string>
using namespace std;
//1.查找
void test01() {
string s1 = "abcdefgde";
int pos = s1.find("de");
if (pos == -1) {
cout << "未找到字符串" << endl;
}
else {
cout << "找到字符串,pos = " << pos << endl;
}
//rfind
pos = s1.rfind("de");
cout << "pos = " << pos << endl;
}
//2.替换
void test02() {
string s1 = "abcdefgde";
s1.replace(7, 2, "hij");
cout << "s1 = " << s1 << endl;
}
int main() {
test02();
system("pause");
return 0;
}
6.string字符串比较
功能描述:
- 字符串之间的比较
比较方式:
- 字符串比较是按字符的ASCⅡ码进行对比
= 返回 0
> 返回 1
< 返回 -1
函数原型:
int compare(const string &s) const;
//与字符串s比较int compare(const char *s) const;
//与字符串s比较
#include<iostream>
#include<string>
using namespace std;
void test01() {
string s1 = "abcdefxg";
string s2 = "abcdefgde";
if (s1.compare(s2) == 0) {
cout << "s1 == s2" << endl;
}
else if (s1.compare(s2) > 0) {
cout << "s1 > s2" << endl;
}
else if (s1.compare(s2) < 0) {
cout << "s1 <s2" << endl;
}
}
int main() {
test01();
system("pause");
return 0;
}
总结:字符串对比主要是用于比较两个字符串是否相等,判断谁大谁小的意义并不是很大
7. string字符存取
string单个字符存取方式有两种
char& operator[](int n)
//通过[]方式取字符char& at(int n);
//通过at方法获取字符
#include<iostream>
#include<string>
using namespace std;
void test01() {
string s1 = "hello";
//1.通过[]方式取字符
for (int i = 0; i < s1.size(); i++) {
cout << s1[i] << " ";
}
cout << endl;
//2.通过at方法获取字符
for (int i = 0; i < s1.size(); i++) {
cout << s1.at(i) << " ";
}
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:string字符串中单个字符存取有两种方式,利用[]或at
8.string插入和删除
功能描述:
- 对string字符串进行插入和删除字符操作
函数原型:
string& insert(int pos, const char* s);
//插入字符串string& insert(int pos, const string& s);
//插入字符串string& insert(int pos, int n, char c);
//在指定位置插入n个字符cstring& erase(int pos, int n = npos);
//删除从pos开始的n个字符
#include<iostream>
#include<string>
using namespace std;
void test01() {
string str = "hello";
//1.插入
str.insert(1, "111");
cout << str << endl;
//2.删除
str.erase(1, 3);
cout << str << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:插入和删除的起始下标都是从0开始
9.string子串
功能描述:
- 从字符串中获取想要的字串
函数原型:
string substr(int pos = 0, int n = npos) const;
//返回由pos开始的n个字符组成的字符串
#include<iostream>
#include<string>
using namespace std;
void test01() {
string str = "abcdef";
string subStr = str.substr(1, 3);
cout << subStr << endl;
}
//实用操作
void test02() {
string email = "zhangsan@sina.com";
//从邮件的地址中获取用户名信息
int pos = email.find("@"); //8
string userName = email.substr(0, pos);
cout << userName << endl;
}
int main() {
test02();
system("pause");
return 0;
}
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.