1. 基本操作
1.1 头文件
1 |
1.2 声明与初始化
1 | string s0("Initial string"); |
2. 运算符重载
+ 和 += | 连接字符串 |
---|---|
= | 字符串赋值 |
>、>=、< 和 <= | 字符串比大小(例如a < b, aa < ab) |
==、!= | 字符串是否相等 |
cin << s、cout >> s | 字符串输入输出,不能读入空格,以空格、制表符、回车符为结束标志 |
getline(cin, s) | 字符串输入输出,可以读入空格和制表符,以回车符作为结束标志 |
注意:使用重载的运算符 + 时,必须保证前两个操作数至少有一个为 string 类型。例如,下面的写法是不合法的:
1 |
|
3. 字符串处理
3.1 使用下标访问元素 []
1 | cout << str[0] << endl; |
3.2 使用 at()
方法访问
1 | cout << str.at(0) << endl; // (如果溢出会抛出异常) |
3.3 size()
获取字符串长度
1 | string str = "12345"; |
3.4 length()
获取字符串长度
1 | string str = "12345"; |
3.5 capacity()
获取字符串容量
1 | string str = "12345"; |
3.6 resize()
更改字符串大小
这里改变的是 size()
大小,即string中字符数量。
(1)若新的大小n比原来的 size()
小,则多于n的部分直接删除。
(2)若新的大小n大于string中当前元素数量,则会在string当前的尾部掺入适量元素,是的vector的大小变为n。如果,为 resize()
方法指定了第二个参数,则会把后插入的原始值,初始化为该指定值,如果没有为 resize()
指定第二个参数,则会把新插入的元素初始化为默认的初始值。
1 | string str = "12345"; |
3.7 reserve()
改变字符串容量大小
3.8 empty()
字符串是否为空
1 | str.empty(); |
3.9 clear()
清除字符串
1 | str.clear(); |
3.10 substr()
获取子串
1 | string s = "abcdefg"; |
3.11 push_back()
末尾追加一个字符
1 | str.push_back('c'); // 末尾追加一个字符'c' |
3.12 pop_back()
删除末尾一个字符
1 | str.pop_back(); |
以上这两个方法在 string中不常用
因为字符串追加有+=
运算符,append()
、insert()
等
字符串删除有erase()
、substr()
等
3.13 append()
末尾追加 字符 或 字符串
1 |
|
3.14 insert()
插入
1 |
|
3.15 replace()
替换
replace支持使用无符号整数寻找位置,也支持用迭代器寻找位置
1 |
|
以上的replace操作可以用insert和erase的操作组合替换,但是replace操作更加方便。
3.16 assign()
为字符串赋新值
1 |
|
3.17 erase()
删除
删除操作有三种:
- 指定pos和len,其中pos为为起始位置,pos以及后面len-1个字符串都删除
- 迭代器,删除迭代器指向的字符
- 迭代器范围,删除这一范围的字符串,范围左闭右开
1 |
|
3.18 compare()
函数
由于string重载了运算符,可以直接用>、<、>=、<=、==、!=来进行比较
或者使用 compare()
函数比较,其和strcmp函数一样,如果两个字符串相等,那么返回0,调用对象大于参数返回1,小于返回-1。 在compare当中还支持部分比较,里面有6个参数可以设置。
1 |
|
3. string 转换为 const char* 、char * 或者 char[]
1、如果要将 string
转换为 const char*
,可以使用string提供的函数 c_str()
,或是函数 data()
data()
除了返回字符串内容外,不附加结束符’’- 而
c_str()
返回一个以‘’结尾的字符数组
2、const char *c_str()
函数返回一个指向正规C字符串的指针,内容与本string串相同。这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数 c_str()
把string 对象转换成c中的字符串样式。注意:一定要使用 strcpy()
函数 等来操作方法 c_str()
返回的指针。
比如:最好不要这样:
1 | string s = "1234"; |
应该使用如下方式:
3.1 调用 string的 c_str()
函数 [返回的是const char , 或者使用(char ) 强转成 char *]
1 |
|
3.2 调用 string 的 data()
函数 [返回的是const char , 或者使用(char ) 强转成 char *]
和上面方法一致,只是返回字符串内容,不附加结束符’’
3.3 调用 string 的 copy()
函数 [返回的是 char *]
1 | string str = "hello world"; |
4. char * 、char []转换为 string
4.1 char * 转 string
可以直接赋值
1 | string s; |
4.2 char [] 转 string
可以直接赋值
1 | string s; |
5. char* 与 char[] 互转
5.1 char[] 转 char*
可以直接赋值
1 | char ch[] = "hello world"; |
5.2 char * 转 char[]
不能直接赋值,可以循环char*字符串逐个字符赋值,也可以使用strcpy()
或 strcpy_s()
等函数。
1 | char *p = "hello world"; |
总结:char[] 数组转换为其他类型,可以直接赋值。
6. 查找
6.1 find()
函数
主要是查找一个字符串是否在调用的字符串中出现过,大小写敏感。
1 |
|
6.2 rfind()
函数
找最后一个出现的匹配字符串,返回的位置仍然是从前往后数的。
1 |
|
6.3 find_….of
函数
find_first_of(args)
:查找args中任何一个字符第一次出现的位置find_last_of(args)
:最后一个出现的位置find_fist_not_of(args)
: 查找第一个不在args中的字符find_last_not_of(args)
: 查找最后一个不在args中出现的字符
1 |
|
find_last_of()
和 find_last_not_of()
与 first
基本相同,就不写例子代码了。
7. 实例
7.1 查找给定字符串并把相应子串替换为另一给定字符串
string 并没有提供这样的函数,所以我们自己来实现。由于给定字符串可能出现多次,所以需要用到 find()
成员函数的第二个参数,每次查找之后,从找到位置往后继续搜索。直接看代码(这个函数返回替换的次数,如果返回值是 0 说明没有替换):
1 | int str_replace(string &str, const string &src, const string &dest) { |
7.2 从给定字符串中删除一给定字串
方法和上面相似,内部使用 erase()
完成。代码:
1 | int str_erase(string &str, const string src) { |
7.3 给定一字符串和一字符集,从字符串剔除字符集中的任意字符
1 | int str_wash(string &str, const string src) { |
7.4 分割字符串(以逗号分隔符为例,分割得到相应数字)
1 | /* |
8. 数值转换
在io的部分有过数值和字符串相互转换的例子,使用的是stringstream函数,在c++11当中有定义好的现成的函数取调用,非常方便。
string和数值转换 | |
---|---|
to_string(val) | 把val转换成string |
stoi(s,p,b) | 把字符串s从p开始转换成b进制的int |
stol(s,p,b) | long |
stoul(s,p,b) | unsigned long |
stoll(s,p,b) | long long |
stoull(s,p,b) | unsigned long long |
stof(s,p) | float |
stod(s,p) | double |
stold(s,p) | long double |
//注意,下段代码在MinGw中会报错!即使使用c++11编译也一样,无法识别to_string!
1 |
|
9. Reference
- https://blog.csdn.net/tengfei461807914/article/details/52203202
- https://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html
- https://www.cnblogs.com/devilmaycry812839668/p/6353807.html
- https://blog.csdn.net/hebbely/article/details/79577880
- https://blog.csdn.net/techfield/article/details/77855620
- http://www.cplusplus.com/reference/string/string/?kw=string