This commit is contained in:
e2hang
2025-08-01 00:26:26 +08:00
parent 11fd55f825
commit c5fcf58332
4 changed files with 503 additions and 48 deletions

View File

@@ -173,3 +173,126 @@ std::string s = std::to_string(42);
---
如需我帮你整理成一份笔记或 Markdown 文件,也可以告诉我!你也可以提你最常用的用法,我帮你列举示例。
`std::string``C-style string (cstring)` 是 C++ 中处理字符串的两种主要方式,它们的 **区别与联系** 如下。
---
## 🧠 一句话总结:
> **`std::string` 是 C++ 的高级封装,`cstring` 是 C 语言风格的低级字符数组。**
---
## 🔍 一、基本概念对比
| 特性 | `C-style string (cstring)` | `std::string` |
| ---- | ---------------------------------------- | -------------------------------------------- |
| 本质 | 字符数组(如 `char[]`)以 `\0` 结尾 | 类模板 `std::basic_string<char>` |
| 所属 | C 标准库 `<cstring>` | C++ 标准库 `<string>` |
| 内存管理 | 需手动管理(如 `new``strcpy` | 自动管理RAII |
| 长度 | 用 `strlen()` 计算 | `s.length()` |
| 操作 | 用 `strcpy()``strcat()``strcmp()` 等函数操作 | 用成员函数 `.append()``.substr()``.compare()` 等 |
| 安全性 | 易越界、易内存泄露 | 更安全 |
| 可变性 | 必须预留空间 | 动态扩展 |
| 推荐 | 适合底层接口、嵌入式等 | 推荐用于现代 C++ 开发 |
---
## 📦 二、cstring 提供了哪些函数(头文件 `<cstring>`
| 函数名 | 说明 |
| ------------------------------------------- | ---------------- |
| `strlen(const char*)` | 计算字符串长度(不包括`\0` |
| `strcpy(char*, const char*)` | 拷贝字符串 |
| `strncpy(char*, const char*, size_t)` | 安全拷贝 |
| `strcat(char*, const char*)` | 字符串拼接 |
| `strcmp(const char*, const char*)` | 比较字符串 |
| `strncmp(const char*, const char*, size_t)` | 比较前 n 个字符 |
| `strchr(const char*, char)` | 查找字符首次出现 |
| `strrchr(const char*, char)` | 查找字符最后一次出现 |
| `strstr(const char*, const char*)` | 查找子串首次出现 |
| `memcpy(void*, const void*, size_t)` | 内存拷贝 |
| `memset(void*, int, size_t)` | 内存初始化 |
| `memcmp(const void*, const void*, size_t)` | 内存比较 |
> ⚠️ 注意:这些函数不会检查数组越界,必须手动保证空间足够!
---
## 🎁 三、std::string 提供了哪些成员函数(头文件 `<string>`
详见我上一个回答,但可以再快速总结:
* 构造 / 赋值:`std::string s("abc");`
* 长度:`s.length()`, `s.empty()`
* 访问:`s[i]`, `s.at(i)`
* 修改:`s += "abc"`, `s.insert()`, `s.erase()`, `s.replace()`
* 查找:`s.find("abc")`, `s.substr()`
* 比较:`s1 == s2`, `s.compare()`
* 迭代器:`begin()`, `end()`
* 与 cstring 转换:`s.c_str()`
---
## 🔁 四、二者之间的联系与转换
### ✅ `std::string` 转 `cstring`
```cpp
std::string s = "hello";
const char* cstr = s.c_str(); // 注意:是 const char*
```
> ⚠️ 不可以对 `cstr` 写入内容。`c_str()` 返回的内存由 `std::string` 管理。
### ✅ `cstring` 转 `std::string`
```cpp
const char* cstr = "world";
std::string s = cstr;
```
---
## 💥 五、示例比较
```cpp
#include <iostream>
#include <cstring>
#include <string>
int main() {
// C-style string
char a[20] = "Hello";
strcat(a, " World"); // 注意要有足够空间
std::cout << a << std::endl;
// std::string
std::string s = "Hello";
s += " World"; // 更安全简洁
std::cout << s << std::endl;
// 转换
const char* cstr = s.c_str(); // std::string → cstring
std::string s2 = cstr; // cstring → std::string
}
```
---
## ✅ 六、什么时候用哪个?
| 场景 | 推荐用法 |
| ----------------------------- | ------------------------ |
| 日常开发 | `std::string`(更安全易用) |
| 与 C 接口交互(如 `printf`, `fopen` | 使用 `std::string.c_str()` |
| 内存受限嵌入式环境 | `cstring` |
| 学习 C 语言基础 | `cstring` |
---
如你需要我可以给出一份“对比总结笔记表格Markdown/LaTeX/PDF”或演示更复杂转换例子。要吗