C++ 中 string 的常用函数用法总结(全面实用版)
C++ 中字符串使用std::string(位于<string>头文件),它是标准库提供的强大、安全、易用的字符串类,远优于 C 风格的 char 数组。
1. 头文件与命名空间
#include<string>// 必须包含usingnamespacestd;// 常用,或写 std::string2. 基本创建与初始化
string s1;// 空字符串string s2="hello";// C风格字符串初始化strings3("world");// 构造函数strings4(5,'a');// "aaaaa"strings5(s2);// 拷贝构造strings6(s2,1,3);// 从s2第1位开始取3个字符 → "ell"3. 常用成员函数大全(按功能分类)
| 函数 | 用法示例 | 说明 | 返回值/效果 |
|---|---|---|---|
| 长度与容量 | |||
| size() / length() | s.length() | 返回字符串长度(字符数) | size_t |
| empty() | s.empty() | 判断是否为空 | bool |
| capacity() | s.capacity() | 当前分配的内存容量 | size_t |
| reserve(n) | s.reserve(100) | 预分配空间,避免频繁扩容 | void |
| 增删改 | |||
| += / append() | s += “abc”; s.append(“def”) | 追加字符串 | string& |
| push_back(ch) | s.push_back(‘x’) | 追加单个字符 | void |
| insert(pos, str) | s.insert(2, “xyz”) | 在pos位置插入str | string& |
| erase(pos, len) | s.erase(0, 3) | 从pos开始删除len个字符 | string& |
| clear() | s.clear() | 清空字符串 | void |
| pop_back() | s.pop_back() | 删除最后一个字符(C++11) | void |
| 访问与修改 | |||
| [ ] | s[0] = ‘H’ | 访问/修改字符(不检查边界) | char& |
| at() | s.at(0) = ‘H’ | 访问/修改字符(越界抛异常) | char& |
| front() | char c = s.front() | 第一个字符(C++11) | char& |
| back() | char c = s.back() | 最后一个字符(C++11) | char& |
| 查找 | |||
| find(str, pos=0) | s.find(“abc”) | 从pos开始查找str,返回首次出现位置 | size_t(没找到返回 string::npos) |
| rfind(str, pos=npos) | s.rfind(“abc”) | 从pos向前找最后一次出现位置 | size_t |
| find_first_of(str) | s.find_first_of(“aeiou”) | 找第一个元音位置 | size_t |
| find_last_of(str) | s.find_last_of(“xyz”) | 找最后一个匹配字符位置 | size_t |
| find_first_not_of(str) | 找第一个不在str中的字符 | size_t | |
| 子串 | |||
| substr(pos, len) | string t = s.substr(1, 3) | 从pos开始取len个字符 | string |
| 替换 | |||
| replace(pos, len, str) | s.replace(0, 5, “Hi”) | 用str替换从pos开始的len个字符 | string& |
| 比较 | |||
| compare(str) | s.compare(t) | 字典序比较 | int(<0: s<t, =0相等, >0 s>t) |
| == != < > <= >= | s == t | 支持直接比较运算符 | bool |
| 转换 | |||
| c_str() | const char* p = s.c_str() | 获取C风格字符串(以\0结尾) | const char* |
| data() | const char* p = s.data() | 获取字符数组(C++17前不一定\0结尾) | const char* |
| copy(char* buf, len, pos=0) | s.copy(buf, 5, 0) | 拷贝到buf(不自动加\0) | size_t |
4. 与 C 风格字符串互转
// string → char*string s="hello";constchar*c=s.c_str();// 用于 printf、fopen 等需要 const char* 的函数// char* → stringcharch[]="world";strings2(ch);// 直接构造string s3=ch;// 赋值5. 输入输出(与 cin/cout)
string s;cin>>s;// 读取单词(遇到空格停止)getline(cin,s);// 读取整行(包含空格,推荐)cout<<s<<endl;6. 实用示例代码
#include<iostream>#include<string>usingnamespacestd;intmain(){string s=" Hello World! ";// 常用操作组合s=s.substr(2,5);// "Hello"s.append(" C++");// "Hello C++"s.insert(5,",");// "Hello, C++"s.replace(6,3,"World");// "Hello, World"// 查找size_t pos=s.find("World");if(pos!=string::npos){cout<<"找到位置: "<<pos<<endl;// 输出 7}// 去除首尾空格(C++11前手动实现)s.erase(0,s.find_first_not_of(" \t"));s.erase(s.find_last_not_of(" \t")+1);cout<<"\""<<s<<"\""<<endl;// "Hello, World"return0;}7. 注意事项与最佳实践
size()和length()完全等价。string::npos是常量,通常为 -1(size_t 的最大值),用于表示“未找到”。[]不检查边界,越界未定义行为;at()检查边界,越界抛out_of_range异常。c_str()返回的指针在 string 被修改或销毁后失效。- string 是可拷贝的,但大字符串建议传 const string& 避免拷贝。
- C++11 后推荐使用
front()、back()、pop_back()。
掌握以上函数,就能轻松处理 95% 的字符串操作需求!如果有特定场景(如分割字符串、转数字),欢迎继续提问。