介绍
-
string:
string
是C++标准库中的字符串类,它是一个连续的字符序列,自动管理内存。- 它提供了许多方便的成员函数,如
begin()
,end()
,length()
等。 string
对象在内部使用NULL终止符,但string
类型本身不依赖NULL终止符。string
可以很容易地与其他字符串或字符数组进行操作,并提供类型安全性。
-
char*:
char*
是一个指针,它可以指向一个字符数组(例如字符串)。char*
可以指向在栈上分配的内存或通过new
在堆上分配的内存。- 使用
char*
时,用户需要自己管理内存,这可能导致内存泄漏或其他问题。
-
区别:
string
自动管理内存,而char*
需要手动管理。- 使用
char*
时,如果不小心,可能会导致内存泄漏或悬挂指针等问题。
-
转换:
- 从
string
转换为const char*
:使用c_str()
或data()
方法。两者都会返回一个指向字符串内容的指针,但data()
返回的字符数组没有NULL终止符。 - 从
string
转换得到的const char*
与原始string
对象共享内存,所以当原始字符串被修改时,转换得到的指针指向的内容也会被修改。而使用strcpy_s()
等函数转换后得到的字符串内容不会因为原始字符串的修改而改变。
- 从
-
建议:
- 当处理字符串时,尽量使用
string
类型,因为它提供了许多方便的成员函数并自动管理内存。 - 当需要与旧的C代码或需要直接操作字节的场景中,可以考虑使用
char*
。但在使用时,要特别小心内存管理问题。
- 当处理字符串时,尽量使用
相互转化:
1. string转换成char类型,使用 c_str()和data() 两种转换方式都只能转换成 const char*如果去掉 const 报错;
#include <iostream>
//#include <stdio.h>
#include <string.h>
//#include <cstring>
using namespace std;
int main()
{
string s = "123123";
const char *p1 = s.c_str();
cout << "改变string之前的p1的值: ";
cout << p1 << endl;
//使用 strcpy_s(dest,length, src)函数后原始 string改变 转换成 char* 后并不改变;
char *p3;
int len = s.length();
p3 = (char*)malloc((len + 1)*sizeof(char));
strcpy_s(p3, len + 1, p1);
cout << "p3...." << p3 << endl;
s = "321321";
cout << "改变string之后的p1的值: ";
cout << p1 << endl;
cout <<"p3...."<< p3 << endl;
const char *p2 = s.data();
cout << "改变string之前的p2的值: ";
cout << p2 << endl;
s = "123123";
cout << "改变string之后的p2的值: ";
cout << p2 << endl;
//使用char类型
//char *p3;
//int len = s.length();
//p3 = (char*)malloc((len + 1)*sizeof(char));
//strcpy_s(p3, len+1, p1);
//cout << "*p1 " << p1 << endl;
system("pause");
return 0;
}
string 转 char*:直接赋值即可
char[]转string:遍历赋值
using namespace std;
#pragma warning(disable:4996)
#include <string>
#include <cstdio>
int main()
{
/* string =====> const char* */
string s1 = "123123";
const char *p1 = s1.c_str();
cout << p1 << endl;
const char *p2 = s1.data();
cout << p2 << endl;
/* string =====> char * */
string s2 = "321321";
char *p3 = NULL;
p3 = new char[s2.length() * sizeof(char)];
//p3 = (char *)malloc(s2.length() * sizeof(char));
s2.copy(p3, s2.length(), 0);
cout << p3 << endl;
/* char * =====> string */
char *p = "12341234";
string s3 = p;
cout << s3 << endl;
/* string =====> char [] */
//方法一(使用copy函数:
string s4 = "44444";
char p4[6] = { 0 };
s4.copy(p4, s4.length(), 0);
p4[s4.length()] = '\0'; //填充结束符
cout << p4 << endl;
//方法二(遍历赋值:
string s5 = "1232";
char p5[5] = { 0 };
int i;
for (i = 0; i < s5.length(); i++)
{
p5[i] = s5[i];
}
p5[i] = '\0';
cout << p5 << endl;
system("pause");
return 0;
}