【16. 深入理解 C++ 字符串】

本章目录:

    • 前言
    • C 风格字符串
      • 声明与初始化
      • 输出结果
      • 常用函数
      • 示例
      • 输出结果
    • C++ 的 `string` 类
      • 核心特性
      • 示例
      • 输出结果
      • 常用成员函数
      • 示例:复杂操作
      • 输出结果
    • `sizeof` vs `strlen`
      • 示例
      • 输出结果
    • 总结


前言

C++ 提供了两种主要的字符串表示形式:C 风格字符串C++ 的 string。本文将从两者的概念、用法以及各自的特性入手,详细解读它们的应用场景,并通过创新示例和读者常见疑问为你提供深入的理解。


C 风格字符串

C 风格字符串来源于 C 语言,其本质是一维字符数组,以空字符 \0 结尾。由于其简单、直接,至今在 C++ 中仍然广泛使用。

声明与初始化

以下代码展示了两种等价的字符串声明方式:

#include 
using namespace std;

int main() {
    char site1[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
    char site2[] = "RUNOOB";

    cout << "Site 1: " << site1 << endl;
    cout << "Site 2: " << site2 << endl;

    return 0;
}

输出结果

Site 1: RUNOOB
Site 2: RUNOOB

注意site2 的初始化自动在末尾添加了空字符 \0。而如果手动省略空字符(如 {'C', '+', '+'}),则无法正确表示字符串。

常用函数

C 风格字符串有许多函数可用,以下是常见的操作:

函数 功能
strcpy(s1, s2) 将字符串 s2 复制到 s1
strcat(s1, s2) 将字符串 s2 连接到 s1 末尾
strlen(s1) 返回字符串 s1 的长度
strcmp(s1, s2) 比较 s1s2 的内容,相等返回 0
strchr(s1, ch) 找到 s1 中字符 ch 的首次出现位置
strstr(s1, s2) 找到 s1 中子串 s2 的首次出现位置

示例

#include 
#include 
using namespace std;

int main() {
    char str1[20] = "runoob";
    char str2[20] = "example";
    char str3[20];

    // 复制字符串
    strcpy(str3, str1);
    cout << "After strcpy: " << str3 << endl;

    // 连接字符串
    strcat(str1, str2);
    cout << "After strcat: " << str1 << endl;

    // 计算长度
    cout << "Length of str1: " << strlen(str1) << endl;

    return 0;
}

输出结果

After strcpy: runoob
After strcat: runoobexample
Length of str1: 13

C++ 的 string

string 类由 C++ 标准库提供,它弥补了 C 风格字符串的不足,为字符串操作提供了更加灵活和强大的支持。

核心特性

  • 动态管理内存,无需手动处理 \0
  • 提供了丰富的成员函数,如 appendinsertreplace 等。
  • 支持操作符重载,方便字符串操作。

示例

#include 
#include 
using namespace std;

int main() {
    string str1 = "runoob";
    string str2 = "example";
    string str3;

    // 复制字符串
    str3 = str1;
    cout << "str3: " << str3 << endl;

    // 拼接字符串
    str3 = str1 + str2;
    cout << "str1 + str2: " << str3 << endl;

    // 获取长度
    cout << "Length of str3: " << str3.size() << endl;

    return 0;
}

输出结果

str3: runoob
str1 + str2: runoobexample
Length of str3: 13

常用成员函数

以下是 string 类常用操作的简要说明:

方法 功能
append 在末尾添加字符或字符串
find 查找子字符串首次出现的位置
replace 替换指定范围内的子字符串
substr 提取子字符串
size/length 返回字符串长度

示例:复杂操作

#include 
#include 
using namespace std;

int main() {
    string url = "www.example.com";

    // 拼接
    url.append("/C++");
    cout << "Appended URL: " << url << endl;

    // 查找并删除子串
    size_t pos = url.find("/C++");
    if (pos != string::npos) {
        url.replace(pos, 4, ""); // 删除子串
    }
    cout << "Modified URL: " << url << endl;

    // 提取子域名
    size_t firstDot = url.find_first_of(".");
    size_t lastDot = url.find_last_of(".");
    cout << "Subdomain: " << url.substr(firstDot + 1, lastDot - firstDot - 1) << endl;

    return 0;
}

输出结果

Appended URL: www.example.com/C++
Modified URL: www.example.com
Subdomain: example

sizeof vs strlen

两者虽然都与字符串相关,但功能和使用场景完全不同:

比较项 sizeof strlen
定义 操作符,计算类型或对象所占内存大小 函数,计算字符串长度(不含 \0
编译时 vs 运行时 编译时计算 运行时计算
参数 类型或变量 仅限以 \0 结尾的 C 风格字符串
结果 返回数组所占总内存大小,包括 \0 返回字符串实际字符数,不含 \0

示例

#include 
using namespace std;

int main() {
    char str[20] = "0123456789";

    cout << "strlen: " << strlen(str) << endl; // 长度,不含 \0
    cout << "sizeof: " << sizeof(str) << endl; // 总大小,含 \0

    return 0;
}

输出结果

strlen: 10
sizeof: 20

总结

  • C 风格字符串 适合轻量级、简单的操作,但需要开发者处理内存和边界。
  • C++ 的 string 提供了更强大的功能,推荐在现代 C++ 中使用。
  • sizeof 用于计算内存占用,strlen 用于计算字符串长度,需根据场景正确选择。

掌握字符串操作的多样性和细节,可以让你的代码更加灵活、健壮!


你可能感兴趣的:(C++基础,c++,开发语言,c语言,ubuntu,linux,vim,visual,studio)