⌨ 知识库 C++ char数组和string的区别 `char` 数组和 `string` 都可以保存字符串,但它们的使用方式差别很大。 分类 C++ 难度 基础 阅读 2 分钟 浏览 16 更新 2026-7-16 9:32:18 🌐 所有人可见 登录后记录进度 导出 MD 复制链接 打印 / PDF ## 一、基本区别 | 对比内容 | `char` 数组 | `string` | | ---- | ---------------- | -------------------------- | | 本质 | 字符数组 | C++ 提供的字符串类型 | | 头文件 | 一般使用 `<cstring>` | 使用 `<string>` | | 长度 | 通常需要提前确定 | 可以自动变长 | | 结尾 | 必须有结束符 `'\0'` | 不需要手动处理 `'\0'` | | 赋值 | 不能直接用 `=` 修改整个数组 | 可以直接用 `=` | | 比较 | 不能直接用 `==` 比较内容 | 可以直接用 `==` | | 拼接 | 使用 `strcat()` | 可以直接使用 `+` | | 获取长度 | 使用 `strlen()` | 使用 `.length()` 或 `.size()` | | 安全性 | 容易数组越界 | 相对安全、方便 | --- ## 二、定义方式不同 ### 1. `char` 数组 ```cpp char a[10] = "hello"; ``` 数组中实际保存的是: ```text 'h' 'e' 'l' 'l' 'o' '\0' ``` 其中 `'\0'` 表示字符串结束。 虽然 `"hello"` 只有 5 个字符,但它实际需要占用 6 个位置,因为最后还有一个 `'\0'`。 ### 2. `string` ```cpp string a = "hello"; ``` 使用 `string` 时,不需要自己考虑字符串结束符,也不需要提前设置固定长度。 --- ## 三、修改字符串 ### `char` 数组不能直接整体赋值 下面这种写法是错误的: ```cpp char a[10]; a = "hello"; ``` 因为数组名 `a` 不能被整体赋值。 通常需要使用: ```cpp strcpy(a, "hello"); ``` 而 `string` 可以直接赋值: ```cpp string a; a = "hello"; ``` --- ## 四、比较字符串 ### `char` 数组不能直接使用 `==` 比较内容 ```cpp char a[10] = "abc"; char b[10] = "abc"; if (a == b) ``` 这里比较的不是两个字符串的内容,而是两个数组的地址,所以不能这样比较。 应该使用: ```cpp if (strcmp(a, b) == 0) ``` `string` 可以直接使用 `==`: ```cpp string a = "abc"; string b = "abc"; if (a == b) ``` --- ## 五、字符串拼接 ### `char` 数组 ```cpp char a[20] = "hello"; char b[10] = "world"; strcat(a, b); ``` 执行后,`a` 变成: ```text helloworld ``` 但需要注意:`a` 的数组空间必须足够大,否则可能数组越界。 ### `string` ```cpp string a = "hello"; string b = "world"; a = a + b; ``` 也可以写成: ```cpp a += b; ``` `string` 会自动调整空间,更方便。 --- ## 六、获取长度 ### `char` 数组 ```cpp char a[20] = "hello"; cout << strlen(a); ``` 输出: ```text 5 ``` 注意: ```cpp sizeof(a) ``` 得到的是数组总空间大小,也就是 `20`,不一定是字符串长度。 ### `string` ```cpp string a = "hello"; cout << a.length(); ``` 或者: ```cpp cout << a.size(); ``` 都会输出: ```text 5 ``` --- ## 七、访问单个字符 二者都可以使用下标访问: ```cpp char a[10] = "hello"; cout << a[0]; ``` ```cpp string b = "hello"; cout << b[0]; ``` 都会输出: ```text h ``` 也可以修改: ```cpp a[0] = 'H'; b[0] = 'H'; ``` 修改后都是: ```text Hello ``` --- ## 八、输入方式 ### 1. 使用 `cin` ```cpp char a[100]; cin >> a; ``` ```cpp string b; cin >> b; ``` 两种写法遇到空格都会停止。 输入: ```text hello world ``` 最终只会读取: ```text hello ``` ### 2. 读取一整行 `char` 数组使用: ```cpp char a[100]; cin.getline(a, 100); ``` `string` 使用: ```cpp string b; getline(cin, b); ``` 一般来说,`string` 的 `getline()` 更方便。 --- ## 九、常用操作对比 | 操作 | `char` 数组 | `string` | | ---- | ---------------------- | ------------------ | | 定义 | `char a[100];` | `string a;` | | 输入单词 | `cin >> a;` | `cin >> a;` | | 输入一行 | `cin.getline(a, 100);` | `getline(cin, a);` | | 获取长度 | `strlen(a)` | `a.length()` | | 复制 | `strcpy(a, b)` | `a = b` | | 比较 | `strcmp(a, b)` | `a == b` | | 拼接 | `strcat(a, b)` | `a + b` | | 访问字符 | `a[i]` | `a[i]` | --- ## 十、什么时候使用? 普通 C++ 编程题中,**大多数情况下推荐使用 `string`**,因为它: * 不需要提前确定长度; * 可以直接赋值、比较和拼接; * 不需要手动处理 `'\0'`; * 不容易发生数组越界; * 有很多方便的字符串函数。 `char` 数组一般用于: * 题目明确要求使用字符数组; * 学习数组和字符串结束符; * 使用一些传统的 C 风格函数; * 对底层内存操作有特殊要求。 可以简单记住: > `char` 数组是“用数组保存字符”,操作比较麻烦; > `string` 是“专门处理字符串的类型”,操作更加方便。 学习交流公开阅读不需要登录登录后可以评论、收藏并同步学习进度。登录暂时还没有评论。
学习交流