C++ 提供了两种类型的字符串表示形式:C 语言类型和引入的 string 类。在某些场景下,使用新的 string 类来处理字符串十分方便,这里介绍一下其常见的用法。
定义
如果要使用 string,需要添加 string 头文件。但在 C++ 11 中,iostream 这个头文件内好像已经包含了 string ,具体如何,这里不做讨论。
定义 string 的方式跟基本数据类型相同,只需要在 string 后面跟上变量名即可:1
string str;
如果要初始化,就需要直接对 string 类型的变量赋值:1
string str = "abcd";
有时候需要一个含有 n 个相同字符的字符串,此时可以利用 string 的构造函数完成:1
2
3
4
5
6
7
8
9
10
11
using namespace std;
int main() {
string str = string(4, 'a');
cout << str << endl;
return 0;
}
/*
out:
aaaa
*/
还可以用构造函数完成截取字符串的操作:1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int main() {
string str = "abcd";
string s = string(str, 1, 3);
cout << s << endl;
return 0;
}
/*
out:
bcd
*/
访问
C++ 提供了两种多种访问 string 类的方式。
通过下标访问
C++ 可以通过下标直接访问到 string 类型变量的每一个字符变量,如:1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int main() {
string str = "abcde";
for(int i = 0; i < str.length(); i++) {
cout << str[i] << ' ';
}
}
/* out:
a b c d e
*/
访问单个字符还可以通过 at 函数来完成:1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int main() {
string str = "abcde";
for(int i = 0; i < str.length(); i++) {
cout << str.at(i) << ' ';
}
}
/* out:
a b c d e
*/
如果要输入或输出整个字符串,就得用 cin 和 cout:1
2
3
4
5
6
7
8
using namespace std;
int main() {
string str;
cin >> str;
cout << str;
}
硬要用 scanf 和 printf 也是可以的,如:1
2
3
4
5
6
7
8
using namespace std;
int main() {
string str;
scanf("%s", str.c_str());
printf("%s", str.c_str());
}
通过迭代器访问
string 类与其他 STL 容器一样,也是支持用迭代器访问的,如:1
2
3
4
5
6
7
8
9
10
11
12
13
using namespace std;
int main() {
string str = "abcde";
string::iterator it = str.begin();
for(; it != str.end(); it++) {
cout << *it << ' ';
}
}
/* out:
a b c d e
*/
这个用法有点类似指针,另外,it + 2
和str[2]
表示的是同一个字符。
操作符
operator +=
这是 string 的加法,类似 C 语言中的 strcat,java 里面也有类似的用法,如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using namespace std;
int main() {
string str1 = "abcde";
string str2 = "efghi";
string str3 = str1 + str2;
str1 = str1 + str2;
cout << str1 << endl << str3 << endl;;
}
/* out:
abcdeefghi
abcdeefghi
*/
注意:string 类可没有 +、/、×,不要惯性思考了。
compare operator
两个 string 类型的变量可以直接用 <、>、==、<=、>=、!= 直接进行比较,规则是按字典序逐个字符进行比较,这个功能类似 C 语言中的 strcmp,如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using namespace std;
int main() {
string str1 = "aa", str2 = "aaa", str3 = "abc", str4 = "xyz";
if(str1 < str2) printf("1\n");
if(str1 != str3) printf("2\n");
if(str4 >= str3) printf("3\n");
}
/* out:
1
2
3
*/
常用函数
相较于 C 语言,string 类封装了很多常用的字符串操作函数,可以直接拿来用,很方便。
length/size
length 和 size 返回 string 的长度,也就是字符串的长度,如:1
2
3
4
5
6
7
8
9
10
using namespace std;
int main() {
string str1 = "aaa", str2 = "11aaa";
cout << str1.size() << ' ' << str2.length();
}
/* out:
3 5
*/
insert
insert 的用法有很多,这里只列举常见的几个用法。
字符串中插入字符串
基本写法:str1.insert(pos, str2)
,在 str1 的 pos 这个位置,插入字符串 str2,如:1
2
3
4
5
6
7
8
9
10
11
using namespace std;
int main() {
string str1 = "aaz", str2 = "11aaa";
str1.insert(2, str2);
cout << str1;
}
/* out:
aa11aaaz
*/
还可以使用迭代器来完成,如:1
2
3
4
5
6
7
8
9
10
11
using namespace std;
int main() {
string str1 = "aaz", str2 = "11aaa";
str1.insert(str1.begin() + 2, str2.begin(), str2.end());
cout << str1;
}
/* out:
aa11aaaz
*/
字符串中插入多个字符
基本写法:str1.insert(pos, count, ch)
,在 str1 的 pos 这个位置,插入 count 个字符 ch,如:1
2
3
4
5
6
7
8
9
10
11
using namespace std;
int main() {
string str1 = "aaz";
str1.insert(2, 1, 'c');
cout << str1;
}
/* out:
aacz
*/
同样,也可以使用迭代器来完成。
参考链接:C++ string类insert用法总结
erase
erase 可以用来删除单个字符或一个区间内的所有字符。
删除单个字符
基本写法:str1.erase(it)
,it 为要删除的字符的迭代器,如:1
2
3
4
5
6
7
8
9
10
11
using namespace std;
int main() {
string str1 = "abcde";
str1.erase(str1.begin() + 2);
cout << str1;
}
/* out:
abde
*/
删除一个区间内的字符
删除一个区间内的字符有两种方法,str1.erase(first, last)
和str1.erase(pos, length)
,也就是区间的写法。第一种写法 first 与 last 必须要是迭代器,删除的区间是[first, last),左闭右开;第二种写法中 pos 为需要开始删除的起始位置,length 为删除的字符个数,如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using namespace std;
int main() {
string str1 = "abcdefg", str2;
str2 = str1;
str1.erase(str1.begin() + 2, str1.end() - 1);
cout << str1 << endl;
str2.erase(2, 4);
cout << str2;
}
/* out:
abg
abg
*/
参考链接:c++ string的erase删除方法
clear
clear 用来清空 string 中的数据,如:1
2
3
4
5
6
7
8
9
10
11
using namespace std;
int main() {
string str1 = "abcdefg";
str1.clear();
cout << str1.length();
}
/* out:
0
*/
substr
substr 用来返回子串,基本写法:str.substr(pos, len)
,即返回从 pos 开始,长度为 len 子串,如:1
2
3
4
5
6
7
8
9
10
11
using namespace std;
int main() {
string str1 = "abcdefg", str2;
str2 = str1.substr(3, 3);
cout << str2;
}
/* out:
def
*/
也可以直接写str.substr(pos)
,会直接返回从 pos 开始,直到字符串结尾的子串。
find
find 用来查找子串,这个子串也可以是一个字符,基本写法:str.find(str2)
或str.find(str2, pos)
,如果不加参数 pos,那么 find 会返回 str2 在 str 中第一次出现的位置,否则就返回 string::npos(是一个常数,本身的值是 -1,但由于它是 unsigned_int 类型,所以也可以认为是 4294967295)。而加了 pos 后,就会从 str 的第 pos 个位置开始匹配 str2,返回值与不加 pos 一致。如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using namespace std;
int main() {
string str = "hello world";
string str1 = "llo", str2 = "you";
cout << str.find('e') << endl;
if(str.find(str1) != string::npos) cout << str.find(str1) << endl;
if(str.find(str1, 2) != string::npos) cout << str.find(str1, 2) << endl;
if(str.find(str2) != string::npos) cout << str.find(str2) << endl;
else cout << "no pos" << endl;
}
/* out:
1
2
2
no pos
*/
参考链接:C++ string中的find()函数
replace
replace 用来替换子串,基本用法:str.replace(pos, len, str2)
或str.replace(it1, it2, str2)
。第一种写法是把 str 从第 pos 个位置开始、长度为 len 的子串替换为 str2;第二种写法是把 str 的迭代器 [it1, it2) 范围的子串替换为 str3,如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
using namespace std;
int main() {
string str = "Maybe you will turn around.";
string str2 = "will not";
string str3 = "surely";
cout << str.replace(10, 4, str2) << endl;
cout << str.replace(str.begin(), str.begin() + 5, str3) << endl;
}
/* out:
Maybe you will not turn around.
surely you will not turn around.
*/
to_string
to_string 用来将数值转化为字符串,基本用法:string num = to_string(1234213)
,如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using namespace std;
int main() {
string str = to_string(1234567);
cout << str << endl;
str = to_string(1.223563333);
cout << str << endl;
str = to_string(-121);
cout << str << endl;
}
/* out:
1234567
1.223563
-121
*/
这个函数,处理某些问题时,可能有奇效。
参考链接:c++ to_String()
append
append 函数用来向字符串末尾添加字符或另一个字符串,基本用法:str.append(5, '+')
或str1.append(str2)
,如:1
2
3
4
5
6
7
8
9
10
11
12
13
using namespace std;
int main() {
string str1 = "abcd", str2 = "efgh";
cout << str1.append(5, '+') << endl;
cout << str1.append(str2) << endl;
return 0;
}
/* out:
abcd+++++
abcd+++++efgh
*/
参考链接:C++中string append函数的使用与字符串拼接
pop_back/push_back
严格来讲,这两个函数应该是从基类继承过来的(盲猜一下 string 的基类估计是 vector 😂),用法上与 vector 中的 push_back 和 pop_back 无差别:1
2
3
4
5string str = "aaa"
// 在 str 末尾添加一个字符 b
str.push_back('b');
// 在 str 末尾删除一个字符
str.pop_back();