[C++杂记] char*\const char*\string相互转化

本文详细介绍了C++中不同字符串类型之间的转换方法,包括从const char*到char*、从string到char*及const char*等多种转换方式,并解释了每种方法的工作原理及其适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、const char * 转换为 char *的2种方法

1、

指向const的指针不能被赋给指向非const的指针,所以应该用strcpy,也就是另开一块内存,把字符一个个复制过去

const char *expr = "goodidea";
char *buf = new char[strlen(expr)+1];
strcpy(buf, expr);
buf[strlen(a)] = '\0';

strcpy  
原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回:指向dest的指针。

2、

使用const_cast<char*>

const char* tmp = "goodidea";
char* p = const_cast<char*>(tmp);
使用这种方法得到的p仍然不可以改变指向的存储空间的内容。这是因为立即数"goodidea"放在存储常数的内存区域,该区域中的立即数无法更改,若强行访问会发生运行时错误(runtime error)。详见引用4。

在有些情况下,将const char*转化为char*仅仅是某个函数需要一个char*的参数,在这种情况下,可以考虑用这种方法。


虽然指针p可以更改存储区域的内容,但是由于常量存储在常量区,该部分是程序自动分配的,不由程序员指定,该区域的常量无法改变。所以p不可改变内容。

2、string转化为char*

1、使用copy函数
string str="hello";
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符
cout < <p;

2、可以先将string转换为const char*然后在将const char*转化为char*

3、string转换为const char* 的2种方法

1、data
如:
string str="abc";
const char *p=str.data();


2、c_str
如:string str="gdfd";
const char *p=str.c_str();

4、char*转化为const char*

直接赋值。

char *c= new char[5];
c[0] = 'g';
c[1] = 'o';
c[2] = 'o';
c[3] = 'd';
c[4] = '\0';

const char *b = c;
c[0] = 'a';	
cout << c;
cout << b;

上面的输出都是aood。

直接赋值的方法,使得指针c和常量指针b同时指向一块存储区域。此时,通过指针c可以改变该存储区域的内容,通过b不可以改变。


由于存储空间是程序员自己通过new指定的,存放在堆中。所以通过c指针可以更改内容,而通过b指针不可更改内容。

5、char*转化为string的方法

直接赋值。
string类自带的拷贝构造函数和“=”号使用了深拷贝。改变sting中的字符不会改变char*中的。

6、const char*转化为string

直接赋值
string类自带的拷贝构造函数和“=”号使用了深拷贝。string中的字符可以改变,而不受const影响。

总结:

1、转化为string的:直接赋值
2、转化为char*的:重新开辟内存,赋值一份
3、转化为const char*的:由char*转,直接赋值;由string转化,使用c_str()或者data()

引用:

1、51CTO博客 阳光如瀑 const char * 转换为 char *

2、新浪博客 notyme的博客 将string转换成char* (转)

3、csdn perfume  char*,const char*和string 三者转换

4、ChinaUnix论坛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值