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[]相互转化
类型转换 | string | char* | const char* | char [] |
---|---|---|---|---|
string | NULL | strcpy() | c_str() | copy() |
char* | 直接赋值 | NULL | 直接赋值 | strncpy_s() |
const char* | 直接赋值 | const_cast | NULL | strncpy_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