string基本概念
本质:
- string是C++风格的字符串,而string本质上是一个类
string和char * 区别:
- char * 是一个指针
- string是一个类,类内部封装了char *,管理这个字符串,是一个char *型的容器。
特点:
- string 类内部封装了很多成员属性和方法
- string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
- 包含头文件
#include <string>
string初始化及赋值
1. 构造函数原型
-
string();
// 创建一个空的字符串 例如: string str; -
string(const char* s);
// 使用字符串s初始化 -
string(const string& str);
// 使用一个string对象初始化另一个string对象
示例:
string str = "hello world";
const char *str0 = "hello";
string str1; // 创建空字符串,调用无参构造函数
string str2(str); // 调用拷贝构造函数
cout << str2 << endl;
2. 字符串赋值
C++内部已对operator=(const string &s)等一系列的=进行运算符重载,并且通过函数重载的方式实现支持将string类型、char *类型以及char 字符类型赋值给string字符串变量,可直接赋值,简洁明了。
示例:
string str = "hello world";
const char *str0 = "hello";
string str1; // 创建空字符串,调用无参构造函数
str1 = str0;
cout << str1 << endl;
str1 = 's';
cout << str1 << endl;
assign方法赋值:
同时,string类型有赋值的方法assign,可以指定赋值前n个字符给目标字符,默认全部赋值,其中函数第一个参数为源字符串。
示例:
string str = "hello world";
string str1; // 创建空字符串,调用无参构造函数
str1.assign("hello world",7);
cout << str1 << endl;
3. 字符串拼接
C++内部已对operator+(const string &s)等一系列的+进行运算符重载,并且通过函数重载的方式实现支持将string类型、char *类型以及char 字符类型字符串相加,可直接赋值,简洁明了。
string str1 = "hello";
string str2 = " world";
string str3;
str3 = str1 + str2;
cout << str3 << endl;
append方法拼接
同时,string类型有拼接的方法append,函数原型如下:
// 把字符串s连接到当前字符串结尾
string& append(const char *s);
//字符串s中从pos开始的n个字符连接到字符串结尾
string& append(string &s, int pos, int n);
示例:
string str1 = "hello";
string str2 = " world";
string str3;
str3 = str1 + str2;
cout << str3 << endl;
str3.append(str2,0,3);
cout << str3 << endl;
string字符存取(遍历)
string中单个字符存取有两种方式:
- 通过 [ ] 方式获取字符
- 通过 at 方法获取字符
获取字符串长度:利用字符串 size( ) 方法
示例:
void test()
{
string str = "hello world!";
int i = 0;
//通过[]遍历字符串
for(i = 0; i < str.size(); i++)
cout << str[i];
cout << endl;
//通过at()方法遍历字符串
for(i = 0; i < str.size(); i++)
cout << str.at(i);
cout << endl;
//对字符串特定字符赋值
str[0] = 'x';
str.at(1) = 'x';
cout << str << endl;
}
字符串的查找和替换
查找函数原型:
//查找str第一次出现位置, 从pos开始查,默认为0
int find(const string& str, int pos = 0)
//查找字符c第一次出现位置
int find(const char c, int pos = 0);
成功返回找到的下标,错误返回-1
示例:
//查找
string str1 = "abcdefgde";
int pos = str1.find("de");
if (pos == -1)
cout << "未找到" << endl;
else
cout << "pos = " << pos << endl;
替换函数原型:
//从pos开始n个字符为字符串str
string& replace(int pos, int n, const string& str);
示例:
//替换
string str1 = "abcdefgde";
str1.replace(1, 3, "1111");
cout << "str1 = " << str1 << endl;
总结:
- find查找是从左往后,rfind从右往左
- find找到字符串后返回查找的第一个字符位置,找不到返回 -1
- replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串
字符串比较
- 字符串比较是按字符的ASCII码进行对比,比较机制与返回值与C语言一样。
函数原型:
//与字符串s比较
int compare(const string &s) const;
示例:
//字符串比较
void test()
{
string str1 = "hello";
string str2 = "aello";
int ret = str1.compare(str2);
if(ret == 0)
cout << "s1 = s2" << endl;
else if(ret > 0)
cout << "s1 > s2" << endl;
else
cout << "s1 < s2" << endl;
}
string取子串
- 从字符串中获取想要的子串
函数原型:
//返回由pos开始的n个字符组成的字符串
string substr(int pos = 0, int n = npos);
示例:
string str = "abcdefg";
string subStr = str.substr(1, 3);
cout << "subStr = " << subStr << endl;
string email = "hello@sina.com";
int pos = email.find('@');
string username = email.substr(0,pos);
cout << "username= " << username << endl;
string web = email.substr(pos+1, email.size()-pos);
cout << "web= " << web << endl;
案例:利用以上字符串操作,自定义实现strtok函数的功能
补充:strtok函数具体功能及参数与返回值
char *strtok(char *str, const char *delim);
- 功能: 字符串切割
- 参数:
str: 当前要切割的字符串
delim: 根据指定的字符串进行切割 - 返回值:
成功: 切割出来的字符
失败: NULL
切割完毕也返回NULL
vector<string> my_strtok(string str)
{
vector<string> v;
int pos = 0;
int begin = 0;
string subStr;
//cout << "src str=" << str << endl;
while(1)
{
pos = str.find(":",begin);
if(pos == -1)
break;
subStr = str.substr(begin, pos-begin);
v.push_back(subStr);
//cout << "sub str=" << subStr << endl;
begin = pos + 1;
}
subStr = str.substr(begin, str.size()-begin);
//cout << "sub str=" << subStr << endl;
v.push_back(subStr);
return v;
}
通过find方法寻找需要分割的字符,并通过substr函数分割子串,最后将各个子串存入容器。
字符串删除和插入
- 对string字符串进行插入和删除字符操作
函数原型:
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个字符
示例:
string str = "hello";
str.insert(1, "111");
cout << str << endl;
str.erase(1, 3); //从1号位置开始删除3个字符
cout << str << endl;
string与char *类型的转化
char * 转 string(构造函数)文章来源:https://www.toymoban.com/news/detail-795363.html
char *c_str = "hello world";
string str(c_str );
string 转 char * (c_str)文章来源地址https://www.toymoban.com/news/detail-795363.html
string str("hello world");
char *c_str = str.c_str();
到了这里,关于STL常用容器—string容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!