# 字符串处理

URL: https://caijiao.org/cpp/function/strings
Source: docs/cpp/function/strings.md
Description: 本节将介绍 C++ 中的字符串处理方法。你将学习如何使用 C++ 标准库中的字符串类 'std::string' 来进行字符串的声明、初始化、操作和常见函数的使用。

在 C++ 中，字符串处理是程序开发中的一项基础任务。C++ 提供了多种方法来处理字符串，最常见的是使用 `std::string` 类，它属于 C++ 标准库，提供了丰富的成员函数来处理字符串。通过本节的学习，你将了解如何在 C++ 中使用 `std::string` 类进行常见的字符串操作。

## 字符串的声明与初始化

在 C++ 中，可以使用 `std::string` 类型来声明和初始化字符串。`std::string` 类比传统的字符数组更加灵活，能够自动管理内存。

### 示例：声明与初始化字符串

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    // 使用字符串字面量初始化
    string str1 = "Hello, World!";

    // 使用字符数组初始化
    char arr[] = "Hello, C++!";
    string str2(arr);

    cout << "str1: " << str1 << endl;
    cout << "str2: " << str2 << endl;

    return 0;
}
````

### 输出：

```
str1: Hello, World!
str2: Hello, C++!
```

## 常用字符串操作

`std::string` 类提供了丰富的成员函数来执行字符串操作。以下是一些常见操作：

### 字符串连接

使用 `+` 运算符可以连接两个字符串。

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str1 = "Hello";
    string str2 = "C++";

    // 字符串连接
    string result = str1 + " " + str2;

    cout << "连接后的字符串: " << result << endl;

    return 0;
}
```

### 输出：

```
连接后的字符串: Hello C++
```

### 字符串长度

使用 `length()` 或 `size()` 方法获取字符串的长度。

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello, World!";
    cout << "字符串长度: " << str.length() << endl;
    return 0;
}
```

### 输出：

```
字符串长度: 13
```

### 字符串查找

可以使用 `find()` 方法查找子字符串的位置，返回第一次出现子字符串的索引。如果未找到子字符串，返回 `string::npos`。

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello, C++ World!";
    
    // 查找字符位置
    size_t pos = str.find("C++");
    if (pos != string::npos) {
        cout << "'C++' 出现的位置: " << pos << endl;
    } else {
        cout << "'C++' 未找到!" << endl;
    }

    return 0;
}
```

### 输出：

```
'C++' 出现的位置: 7
```

### 字符串替换

使用 `replace()` 方法替换字符串中的指定部分。

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello, C++ World!";
    
    // 替换字符串中的部分内容
    str.replace(7, 3, "Java");

    cout << "替换后的字符串: " << str << endl;

    return 0;
}
```

### 输出：

```
替换后的字符串: Hello, Java World!
```

### 字符串比较

使用 `==` 运算符或 `compare()` 方法进行字符串的比较。

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str1 = "Hello";
    string str2 = "Hello";

    // 使用 == 比较字符串
    if (str1 == str2) {
        cout << "两个字符串相等!" << endl;
    }

    return 0;
}
```

### 输出：

```
两个字符串相等!
```

## C 风格字符串与 C++ 字符串的转换

有时你可能需要在 C 风格的字符串（`char[]`）与 C++ 字符串（`std::string`）之间进行转换。

### C++ 字符串转 C 风格字符串

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello, C++";

    // 转换为 C 风格字符串
    const char* cstr = str.c_str();

    cout << "C 风格字符串: " << cstr << endl;

    return 0;
}
```

### C 风格字符串转 C++ 字符串

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    const char* cstr = "Hello, C++";

    // 转换为 C++ 字符串
    string str(cstr);

    cout << "C++ 字符串: " << str << endl;

    return 0;
}
```

## 小结

* C++ 中的 `std::string` 类比传统的字符数组提供了更强大的功能，支持动态大小、内存管理等。
* 通过 `+` 运算符、`find()`、`replace()`、`length()` 等方法，可以方便地进行字符串操作。
* `std::string` 类与 C 风格字符串之间的转换十分常见，掌握这些基本操作有助于在不同场景下进行字符串处理。

通过了解和掌握 C++ 字符串的基本操作，你可以更高效地处理程序中的文本数据。
