c语言字符串 c语言string和char的区别


一、概述

`string` 和 `char` 是 C++ 语言中用于处理字符串的两种常见数据类型。其中,`string` 可以被看作是以字符为元素的一种容器,它提供了方便的操作字符串的接口和成员函数。而 `char` 则是一个指针,它可以指向一个字符数组,用于存储字符串数据。

二、主要区别

`string` 的内存管理由系统自动处理,这大大简化了内存管理的复杂性,减少了内存泄漏和越界访问的风险。相比之下,`char` 的内存管理需要用户自己手动处理,这增加了内存管理的难度,也更容易出现内存不足或越界访问的问题。

当需要存储一个字符串但不确定需要多少内存时,使用 `string` 是最佳选择。`string` 提供了丰富的成员函数来处理字符串的每一个字符,使得字符串操作变得非常方便。而 `char` 在处理字符串时,需要自己编写函数来完成,处理过程也更容易出现内存问题。

三、相互转化

1. `string` 转换成 `char`

若要将 `string` 直接转换成 `const char` 类型,可以使用 `.c_str()` 或 `data()` 成员函数。例如:

```cpp

string s1 = "abcdeg";

const char k = s1.c_str(); // 转换成const char

const char t = s1.data(); // 同样可以得到char(非const)

```

如果要转换成非const的 `char`,可以使用 `string` 的 `copy` 成员函数配合动态内存分配:

```cpp

string s1 = "abcdefg";

char data = (char)malloc((s1.length() + 1) sizeof(char));

s1.copy(data, s1.length(), 0); // 注意:需手动释放data所分配的内存

```

2. `char` 转换成 `string`

```cpp

string s;

strcpy(p, "adghrtyh"); // 将字符串复制到p指向的内存区域中

s = string(p); // 将p指向的字符串转换为string类型

```

若使用 `printf` 输出 `string` 类型的数据,需要使用 `.c_str()` 方法获取到 `const char` 后再输出。

3. `char[]` 转换成 `string`

可以直接将 `char[]` 数组的内容赋值给 `string`。但同样需要注意避免从字符串字面量直接赋值到 `char[]`。转换过程如下:

```cpp

string pp = "dagah"; // 假设这是我们要转换的string或char[]数据源

// ... 如果pp是char[]的话直接赋值即可:string s = pp; (但是请留意前述注意事项)

```

4. `string` 转换成 `char[]`

可以通过循环逐个字符地赋值到 `char[]` 中。注意要确保知道 `string` 的长度以避免越界访问:

```cpp

string pp = "dagah"; // 要转换的string数据源

int length = pp.length(); // 获取长度以避免越界访问

char p[length + 1]; // +1为'\0'预留空间,确保是空字符结尾的C风格字符串