C++ 提供了两种类型的字符串表示形式:C 语言类型和引入的 string 类。在某些场景下,使用新的 string 类来处理字符串十分方便,这里介绍一下其常见的用法。
定义
如果要使用 string,需要添加 string 头文件。但在 C++ 11 中,iostream 这个头文件内好像已经包含了 string ,具体如何,这里不做讨论。
定义 string 的方式跟基本数据类型相同,只需要在 string 后面跟上变量名即可:
如果要初始化,就需要直接对 string 类型的变量赋值:
有时候需要一个含有 n 个相同字符的字符串,此时可以利用 string 的构造函数完成:
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream> using namespace std; int main() { string str = string(4, 'a'); cout << str << endl; return 0; }
|
还可以用构造函数完成截取字符串的操作:
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream> using namespace std; int main() { string str = "abcd"; string s = string(str, 1, 3); cout << s << endl; return 0; }
|
访问
C++ 提供了两种多种访问 string 类的方式。
通过下标访问
C++ 可以通过下标直接访问到 string 类型变量的每一个字符变量,如:
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream> using namespace std;
int main() { string str = "abcde"; for(int i = 0; i < str.length(); i++) { cout << str[i] << ' '; } }
|
访问单个字符还可以通过 at 函数来完成:
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream> using namespace std;
int main() { string str = "abcde"; for(int i = 0; i < str.length(); i++) { cout << str.at(i) << ' '; } }
|
如果要输入或输出整个字符串,就得用 cin 和 cout:
1 2 3 4 5 6 7 8
| #include <iostream> using namespace std;
int main() { string str; cin >> str; cout << str; }
|
硬要用 scanf 和 printf 也是可以的,如:
1 2 3 4 5 6 7 8
| #include <iostream> 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
| #include <iostream> using namespace std;
int main() { string str = "abcde"; string::iterator it = str.begin(); for(; it != str.end(); it++) { cout << *it << ' '; } }
|
这个用法有点类似指针,另外,it + 2和str[2]表示的是同一个字符。
操作符
operator +=
这是 string 的加法,类似 C 语言中的 strcat,java 里面也有类似的用法,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <iostream> using namespace std;
int main() { string str1 = "abcde"; string str2 = "efghi"; string str3 = str1 + str2; str1 = str1 + str2; cout << str1 << endl << str3 << endl;; }
|
注意:string 类可没有 +、/、×,不要惯性思考了。
compare operator
两个 string 类型的变量可以直接用 <、>、==、<=、>=、!= 直接进行比较,规则是按字典序逐个字符进行比较,这个功能类似 C 语言中的 strcmp,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <iostream> 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"); }
|
常用函数
相较于 C 语言,string 类封装了很多常用的字符串操作函数,可以直接拿来用,很方便。
length/size
length 和 size 返回 string 的长度,也就是字符串的长度,如:
1 2 3 4 5 6 7 8 9 10
| #include <iostream> using namespace std;
int main() { string str1 = "aaa", str2 = "11aaa"; cout << str1.size() << ' ' << str2.length(); }
|
insert
insert 的用法有很多,这里只列举常见的几个用法。
字符串中插入字符串
基本写法:str1.insert(pos, str2),在 str1 的 pos 这个位置,插入字符串 str2,如:
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream> using namespace std;
int main() { string str1 = "aaz", str2 = "11aaa"; str1.insert(2, str2); cout << str1; }
|
还可以使用迭代器来完成,如:
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream> using namespace std;
int main() { string str1 = "aaz", str2 = "11aaa"; str1.insert(str1.begin() + 2, str2.begin(), str2.end()); cout << str1; }
|
字符串中插入多个字符
基本写法:str1.insert(pos, count, ch),在 str1 的 pos 这个位置,插入 count 个字符 ch,如:
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream> using namespace std;
int main() { string str1 = "aaz"; str1.insert(2, 1, 'c'); cout << str1; }
|
同样,也可以使用迭代器来完成。
参考链接:C++ string类insert用法总结
erase
erase 可以用来删除单个字符或一个区间内的所有字符。
删除单个字符
基本写法:str1.erase(it),it 为要删除的字符的迭代器,如:
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream> using namespace std;
int main() { string str1 = "abcde"; str1.erase(str1.begin() + 2); cout << str1; }
|
删除一个区间内的字符
删除一个区间内的字符有两种方法,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
| #include <iostream> 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; }
|
参考链接:c++ string的erase删除方法
clear
clear 用来清空 string 中的数据,如:
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream> using namespace std;
int main() { string str1 = "abcdefg"; str1.clear(); cout << str1.length(); }
|
substr
substr 用来返回子串,基本写法:str.substr(pos, len),即返回从 pos 开始,长度为 len 子串,如:
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream> using namespace std;
int main() { string str1 = "abcdefg", str2; str2 = str1.substr(3, 3); cout << str2; }
|
也可以直接写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
| #include <iostream> 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; }
|
参考链接: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
| #include <iostream> 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; }
|
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
| #include <iostream> 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; }
|
这个函数,处理某些问题时,可能有奇效。
参考链接:c++ to_String()
append
append 函数用来向字符串末尾添加字符或另一个字符串,基本用法:str.append(5, '+')或str1.append(str2),如:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <iostream> using namespace std;
int main() { string str1 = "abcd", str2 = "efgh"; cout << str1.append(5, '+') << endl; cout << str1.append(str2) << endl; return 0; }
|
参考链接:C++中string append函数的使用与字符串拼接
pop_back/push_back
严格来讲,这两个函数应该是从基类继承过来的(盲猜一下 string 的基类估计是 vector 😂),用法上与 vector 中的 push_back 和 pop_back 无差别:
1 2 3 4 5
| string str = "aaa"
str.push_back('b');
str.pop_back();
|