1. C++字符串基础概念解析
字符串在任何编程语言中都是最基础且最重要的数据类型之一,C++作为一门系统级编程语言,提供了多种处理字符串的方式。与Python、Java等高级语言不同,C++的字符串处理更接近底层,这既带来了灵活性,也增加了复杂性。
C++中的字符串本质上是以空字符('\0')结尾的字符序列。这种设计源于C语言的传统,使得C++可以兼容大量的C字符串处理函数。在内存中,字符串"Hello"实际上存储为'H','e','l','l','o','\0'这6个字符。
注意:字符串字面量(如"Hello")在C++中是常量,存储在程序的只读数据段,试图修改它们会导致未定义行为。
C++标准库提供了string类来简化字符串操作,它封装了底层的字符数组,自动管理内存,并提供了丰富的成员函数。string对象在堆上动态分配内存,可以根据需要自动调整大小,这比原始的C风格字符串安全得多。
2. C风格字符串详解
2.1 基本表示与初始化
C风格字符串是字符数组,以空字符'\0'作为结束标志。有以下几种初始化方式:
cpp复制// 方式1:字符数组初始化
char str1[] = {'H','e','l','l','o','\0'};
// 方式2:字符串字面量初始化
char str2[] = "Hello"; // 编译器自动添加'\0'
// 方式3:指针形式
const char* str3 = "Hello"; // 注意const修饰
2.2 常用操作函数
C标准库提供了一系列字符串处理函数,位于
strlen(str):返回字符串长度(不包括'\0')strcpy(dest, src):复制字符串strcat(dest, src):连接字符串strcmp(str1, str2):比较字符串strstr(haystack, needle):查找子串
cpp复制#include <cstring>
char s1[20] = "Hello";
char s2[] = " World";
strcat(s1, s2); // s1变为"Hello World"
警告:使用这些函数时必须确保目标缓冲区足够大,否则会导致缓冲区溢出,这是许多安全漏洞的根源。
2.3 内存布局示例
考虑以下声明:
cpp复制char name[] = "Alice";
内存布局如下:
code复制地址 | 值 | 字符
------|-----|-----
0x100 | 0x41 | 'A'
0x101 | 0x6C | 'l'
0x102 | 0x69 | 'i'
0x103 | 0x63 | 'c'
0x104 | 0x65 | 'e'
0x105 | 0x00 | '\0'
3. C++标准库string类
3.1 基本用法
string类定义在
cpp复制#include <string>
using namespace std;
string s1; // 空字符串
string s2 = "Hello"; // 初始化
string s3(
