字符串操作的常用成员函数总结,包含`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) 复制字符串srcdest(需确保dest空间足够,否则导致缓冲区溢出)。 cpp<br>char dest[20] = ""; <br>strcpy(dest, "source"); // dest变为"source"<br>
strcat(char* dest, const char* src) 拼接字符串srcdest末尾(需确保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易导致溢出)。
功能丰富性 内置大量成员函数(如findreplacesubstr等)。 依赖C标准库函数,功能相对基础,需组合使用。
空值处理 empty()明确判断空字符串。 通过strlen(s) == 0或指针是否为NULL判断。
数据类型 模板类std::basic_string<char>,可直接操作。 本质为char*指针或静态数组,需通过指针操作。
兼容性 可通过c_str()转换为C风格字符串。 无法直接转换为std::string,需构造函数转换。

注意事项

  1. 使用场景选择

    • 推荐优先使用std::string,尤其在需要动态扩展、复杂操作或安全性要求高的场景。
    • C风格字符串适用于与C语言接口对接、底层开发或对性能要求极高的场景(需谨慎处理内存)。
  2. 转换问题

    • std::string转C风格字符串:通过c_str()获取const char*(结果包含\0)。
    • C风格字符串转std::string:直接通过构造函数std::string str(c_str);
  3. 性能考量

    • std::string的某些操作(如频繁拼接)可能存在额外开销,可通过reserve()预分配空间优化。
    • C风格字符串操作更底层,性能可能更高,但需牺牲安全性和开发效率。
  4. 避免混合使用

    • 尽量避免在同一逻辑中混合使用两种字符串类型,减少指针操作带来的风险。

通过合理选择字符串类型和函数,可高效、安全地处理字符串相关需求。std::string适合大多数场景,而C风格字符串适用于特定底层或兼容性场景。

posted @ 2025-06-01 19:56  kkman2000  阅读(41)  评论(0)    收藏  举报