C++ 字符数组
外观
C++字符数组[编辑 | 编辑源代码]
字符数组是C++中用于存储字符序列的基础数据结构,本质上是将多个字符按顺序存储在连续内存中。由于C++兼容C风格字符串,字符数组在文本处理、文件操作和底层系统编程中广泛应用。本章将详细介绍字符数组的声明、初始化、操作以及与字符串的关系。
基本概念[编辑 | 编辑源代码]
字符数组是元素类型为char
的一维数组,其特殊之处在于可以表示C风格字符串——以空字符\0
结尾的字符序列。例如:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式包含终止符
等价于:
char greeting[] = "Hello"; // 编译器自动添加\0
内存布局[编辑 | 编辑源代码]
声明与初始化[编辑 | 编辑源代码]
字符数组有多种初始化方式:
方式 | 示例 | 说明 |
---|---|---|
逐个字符初始化 | char arr[4] = {'A', 'B', 'C', '\0'}; |
需手动添加终止符 |
字符串字面量 | char arr[] = "ABC"; |
自动添加\0(大小为4) |
部分初始化 | char arr[5] = "Hi"; |
剩余元素填充\0 |
常用操作[编辑 | 编辑源代码]
输入输出[编辑 | 编辑源代码]
#include <iostream>
using namespace std;
int main() {
char name[50];
cout << "Enter your name: ";
cin >> name; // 输入"Alice"
cout << "Hello, " << name; // 输出"Hello, Alice"
return 0;
}
标准库函数[编辑 | 编辑源代码]
C++通过<cstring>头文件提供操作函数:
函数 | 作用 | 示例 |
---|---|---|
strlen() |
获取长度 | strlen("ABC") → 3
|
strcpy() |
字符串复制 | strcpy(dest, src)
|
strcat() |
字符串连接 | strcat(s1, s2)
|
与string类的对比[编辑 | 编辑源代码]
特性 | 字符数组 | std::string |
---|---|---|
内存管理 | 手动分配 | 自动调整 |
安全性 | 可能缓冲区溢出 | 边界检查 |
操作复杂度 | O(n) | 通常O(1) |
实际应用案例[编辑 | 编辑源代码]
文件路径处理[编辑 | 编辑源代码]
#include <fstream>
using namespace std;
int main() {
char filepath[256] = "/home/user/data.txt";
ifstream file(filepath);
// 文件操作...
return 0;
}
加密算法实现[编辑 | 编辑源代码]
void caesarCipher(char text[], int shift) {
for (int i = 0; text[i] != '\0'; ++i) {
if (isalpha(text[i])) {
char base = islower(text[i]) ? 'a' : 'A';
text[i] = (text[i] - base + shift) % 26 + base;
}
}
}
注意事项[编辑 | 编辑源代码]
- 缓冲区溢出风险:
char arr[5]; cin >> arr;
输入超长会导致崩溃 - 未终止字符串:忘记
\0
可能引发未定义行为 - 内存浪费:固定大小数组可能分配过多空间
高级技巧[编辑 | 编辑源代码]
多维字符数组[编辑 | 编辑源代码]
用于存储字符串集合:
const char* colors[3] = {"Red", "Green", "Blue"};
// 等效于:
char colors[3][6] = {"Red", "Green", "Blue"};
指针运算[编辑 | 编辑源代码]
字符数组名可视为指针:
char str[] = "Hello";
char* p = str + 1; // 指向'e'
数学表示[编辑 | 编辑源代码]
字符数组可视为有限字符序列: 解析失败 (语法错误): {\displaystyle S = \{s_0, s_1, ..., s_{n-1}, \0\} \quad \text{其中} \quad s_i \in \text{ASCII集} }
总结[编辑 | 编辑源代码]
字符数组是C++底层文本处理的核心工具,虽然现代C++更推荐使用std::string
,但在以下场景仍需字符数组:
- 与C语言API交互
- 内存受限环境
- 需要直接操作内存的算法实现
掌握字符数组对于理解C++内存模型和字符串处理机制至关重要。