菜鸟筑基——C++四种字符串类型的爱恨情仇

C++字符串详解

一、C语言风格的字符串

字符串是指使用‘\0’终止的字符串数组。

char a[6]={'H','e','l','l','o','\0'};
char* b = "Hello"; 

以上的字符串在内存中的表示为
在这里插入图片描述

函数作用
strcpy(s1,s2)将s2字符串的内容复制给s1
strcat(s1,s2)将s2字符串的内容拼接到s1后面,返回s1
strlen(s1)返回s1的字符长度
strcmp(s1,s2)从头开始比较s1和s2的字符串,返回这个字符的差值
strchr(s1,ch)返回s1字符串中含有ch字符的位置index
strstr(s1,s2)返回s1中的s2字符串位置

其中的s1,s2都是指向字符串的指针。

二、string类

string是std命名空间中的一个类,能够给字符串分配动态的内存。它是在上面函数的基础上再添加了一些方法。

方法描述
s.append(ch)在string对象s的结尾加上ch字符。
find(s1.begin(),s1.end(),s2)在s1字符串的开始带结尾中找到子字符串s2,返回迭代器
insert(p1,ch)
length(s1)求出string对象s1的长度
replace(s1.begin(),s1.end(),旧字符,新字符)在s1的开始到结束位置的所有旧字符换成新字符
其他方法https://zh.cppreference.com/w/cpp

三、四种字符串类型

1、string类型

能够动态扩展字符串的大小,重构了+操作符,能够拼接字符串。在编码的时候建议使用string类型。

2、char *类型

在声明和初始化的时候,指向常量字符串。

3、const char*类型

一般情况下,在初始化和声明的时候用一个常量指针指向字符串。
ps:const char* 指静态字符指针,指针不能改变;char* const指指向静态字符的指针,字符是可读的不能改变。

4、char [] 类型

字符数组,一个字符串。

———————————————————————————

char* a = "abcd";
char b[]="abcd";

这两者的区别:
变量指针a指向常量abcd;不能变化的常量b指向能够变化的数组“abcd”。
其实,char* a = "abcd"; 是不规范的,正确的写法为const char* a = "abcd"; 。在不规范的情况下,如果使用get(a,“others”),向a所指向的内存中写入数据的话,会报错,因为abcd是指向常量的,是不能改变的。
这里再说一下C++程序在内存中的分布,主要有5个部分:
1、第一个部分是栈,这里的栈是用来存储局部变量。详细的说一下,一般指的是调用方法或函数时存储的相关变量,比如一个递归程序,则在栈的内存中会存储这三块的内容,第一,返回地址,第二,实参的副本和这个实参的类型,第三,本次调用的临时变量。这三部分压入栈中,直到最底层的调用完成,则一层层的弹出数据。如果一直调用不能弹出数据的话则栈会溢出。

2、第二部分是堆,堆是程序员所能控制的内存,比如你new 了一块内存,则会在堆中分配一块区域。如果,你没有用delete释放这块内存,则会一直存在,随着程序的运行,则会造成内存溢出。内存溢出还有许多的问题,这里可以延生到智能指针。

3、第三部分则是自由存储区,当你使用malloc函数来分配内存时,则会分配到自由存储区。

4、全局/静态存储区:此内存区用来存放全局变量和static定义的静态数据成员或者函数,这一块内存是供程序共享的一块内存。

5、常量存储区:用来存放常量,不允许更改。

内容参考:https://blog.csdn.net/qq_34796146/article/details/104139121

下面再说一下,char* 和char[]的相同点
在作为函数参数的时候,char*和char[]他们是相同的。而且在函数作用域内,char[] b的b = = &b == &b[0]的。原因待分析。

四、string、const char*、char * 、char[]相互转化

类型转换stringchar*const char*char []
stringNULLstrcpy()c_str()copy()
char*直接赋值NULL直接赋值strncpy_s()
const char*直接赋值const_castNULLstrncpy_s()
char[]直接赋值直接赋值直接赋值NULL

PS:
1、char*、const char*、char[]变成string,直接赋值;
2、char[]变成string、const char*、char*,直接赋值;
3、char变constchar容易,const char变char麻烦,使用<const_cast><char*>(constchar*);
4、string变成char*,先通过c_str()变成const char类型,再<const_cast><char>(const char*)将const char类型装换为char类型。
5、string变成char[],则需要利用循环挨个赋值,char*、const char*变成char[]则利用strncpy_s()赋值。

参考文献:
【1】https://blog.csdn.net/ksws0292756/article/details/79432329

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值