字符串操作的常用成员函数总结,包含`std::string`类、字符数组/字符指针相关函数
以下是关于字符串操作的常用成员函数总结,包含std::string类、字符数组/字符指针相关函数,以及两者的对比和注意事项:
一、std::string 类常用成员函数
| 函数名 | 描述 | 示例代码 |
|---|---|---|
size()/length() |
返回字符串中有效字符的个数(不包含空字符\0)。 |
cpp<br>std::string str = "hello";<br>std::cout << str.size(); // 输出:5<br> |
empty() |
检查字符串是否为空(等价于size() == 0)。 |
cpp<br>std::string str; <br>if (str.empty()) std::cout << "空字符串";<br> |
operator[] |
通过索引访问指定位置的字符(索引从0开始,不检查越界)。 | cpp<br>std::string str = "world";<br>std::cout << str[1]; // 输出:o<br> |
at(size_t pos) |
通过索引访问指定位置的字符(支持越界检查,越界时抛出out_of_range异常)。 |
cpp<br>std::string str = "test";<br>try { str.at(5); } catch(...) { ... }<br> |
substr(size_t pos = 0, size_t len = npos) |
获取从位置pos开始、长度为len的子字符串(默认取到末尾)。 |
cpp<br>std::string str = "hello world";<br>std::cout << str.substr(6); // 输出:world<br> |
find(const string& str, size_t pos = 0) |
从位置pos开始查找子字符串str,返回首次出现的起始索引;未找到返回npos。 |
cpp<br>std::string str = "abcabc";<br>std::cout << str.find("bc"); // 输出:1<br> |
replace(size_t pos, size_t len, const string& str) |
从位置pos开始删除len个字符,并插入新字符串str。 |
cpp<br>std::string str = "old text";<br>str.replace(0, 3, "new"); // str变为"new text"<br> |
c_str() |
返回以\0结尾的C风格字符数组(const char*)。 |
cpp<br>std::string str = "c_str demo";<br>const char* cstr = str.c_str();<br> |
append(const string& str) |
在字符串末尾追加另一个字符串。 | cpp<br>std::string a = "hello", b = " world";<br>a.append(b); // a变为"hello world"<br> |
clear() |
清空字符串(等价于str = "")。 |
cpp<br>std::string str = "temp";<br>str.clear(); // str变为空字符串<br> |
二、字符数组/字符指针常用函数(C风格字符串)
| 函数名 | 描述 | 示例代码 |
|---|---|---|
strlen(const char* s) |
计算字符串的长度(不包含\0,需包含头文件<cstring>)。 |
cpp<br>char arr[] = "hello";<br>std::cout << strlen(arr); // 输出:5<br> |
strcpy(char* dest, const char* src) |
复制字符串src到dest(需确保dest空间足够,否则导致缓冲区溢出)。 |
cpp<br>char dest[20] = ""; <br>strcpy(dest, "source"); // dest变为"source"<br> |
strcat(char* dest, const char* src) |
拼接字符串src到dest末尾(需确保dest空间足够)。 |
cpp<br>char dest[20] = "hello";<br>strcat(dest, " world"); // dest变为"hello world"<br> |
strcmp(const char* s1, const char* s2) |
比较两个字符串(按字典序),返回值: - 小于0: s1 < s2- 0: s1 == s2- 大于0: s1 > s2 |
cpp<br>char a[] = "apple", b[] = "banana";<br>std::cout << strcmp(a, b); // 输出负数('a' < 'b')<br> |
strchr(const char* s, int c) |
查找字符c在字符串 s中首次出现的位置(返回指针,未找到返回NULL)。 |
cpp<br>char* ptr = strchr("hello", 'l'); // ptr指向第一个'l'的位置<br> |
strstr(const char* haystack, const char* needle) |
查找子字符串needle在主字符串haystack中首次出现的位置(返回指针,未找到返回NULL)。 |
cpp<br>char* pos = strstr("hello world", "world"); // pos指向"world"的起始位置<br> |
三、std::string 与 C风格字符串对比及注意事项
| 对比维度 | std::string | C风格字符串(字符数组/指针) |
|---|---|---|
| 内存管理 | 自动管理内存,无需手动分配/释放。 | 需手动管理内存(malloc/free或静态数组),容易引发内存泄漏或越界。 |
| 安全性 | 提供越界检查(如at()函数)、避免缓冲区溢出。 |
无内置安全检查,需手动确保操作合法性(如strcpy易导致溢出)。 |
| 功能丰富性 | 内置大量成员函数(如find、replace、substr等)。 |
依赖C标准库函数,功能相对基础,需组合使用。 |
| 空值处理 | empty()明确判断空字符串。 |
通过strlen(s) == 0或指针是否为NULL判断。 |
| 数据类型 | 模板类std::basic_string<char>,可直接操作。 |
本质为char*指针或静态数组,需通过指针操作。 |
| 兼容性 | 可通过c_str()转换为C风格字符串。 |
无法直接转换为std::string,需构造函数转换。 |
注意事项:
-
使用场景选择:
- 推荐优先使用
std::string,尤其在需要动态扩展、复杂操作或安全性要求高的场景。 - C风格字符串适用于与C语言接口对接、底层开发或对性能要求极高的场景(需谨慎处理内存)。
- 推荐优先使用
-
转换问题:
std::string转C风格字符串:通过c_str()获取const char*(结果包含\0)。- C风格字符串转
std::string:直接通过构造函数std::string str(c_str);。
-
性能考量:
std::string的某些操作(如频繁拼接)可能存在额外开销,可通过reserve()预分配空间优化。- C风格字符串操作更底层,性能可能更高,但需牺牲安全性和开发效率。
-
避免混合使用:
- 尽量避免在同一逻辑中混合使用两种字符串类型,减少指针操作带来的风险。
通过合理选择字符串类型和函数,可高效、安全地处理字符串相关需求。std::string适合大多数场景,而C风格字符串适用于特定底层或兼容性场景。

浙公网安备 33010602011771号