跳转到内容

C++ 字符数组

来自代码酷

C++字符数组[编辑 | 编辑源代码]

字符数组是C++中用于存储字符序列的基础数据结构,本质上是将多个字符按顺序存储在连续内存中。由于C++兼容C风格字符串,字符数组在文本处理、文件操作和底层系统编程中广泛应用。本章将详细介绍字符数组的声明、初始化、操作以及与字符串的关系。

基本概念[编辑 | 编辑源代码]

字符数组是元素类型为char的一维数组,其特殊之处在于可以表示C风格字符串——以空字符\0结尾的字符序列。例如:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式包含终止符

等价于:

char greeting[] = "Hello"; // 编译器自动添加\0

内存布局[编辑 | 编辑源代码]

graph LR A[0: 'H'] --> B[1: 'e'] B --> C[2: 'l'] C --> D[3: 'l'] D --> E[4: 'o'] E --> F[5: '\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类的对比[编辑 | 编辑源代码]

字符数组 vs std::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++内存模型和字符串处理机制至关重要。