1. C++字符串分类
在C++中,有两种类型的字符串表示形式:① C风格字符串;② C++引入的string字符串。在C++程序中最好不要使用C风格字符串,不仅使用不方便,而且极易引发程序漏洞
2. C风格字符串
- C风格字符串不是一种类型,实际上是使用空(null)字符
'\0'
结尾的一维字符数组char s[6]={'H','e','l','l','o','\0'}
,实际使用中C++编译器会在初始化数组时自动把'\0'
放在字符串末尾char s[]="Hello"
,操作C风格字符串时实际操作的是数组指针 - C++在
cstring
头文件中提供了操作C风格字符串的函数:①strcpy(s1,s2)
:拷贝s2到s1,返回s1;②strcat(s1,s2)
:连接s2到s1的末尾,返回s1;③strlen(s1)
:返回s1的长度,遇到空字符会截断;④strcmp(s1,s2)
:比较s1与s2,相等返回0,大于返回正,小于返回负;⑤strchr(s1,ch)
:返回一个指针,指向s1中字符ch的第一次出现的位置;⑥strstr(s1,s2)
:返回一个指针,指向s1中s2的第一次出现的位置 - 字符串常量值
"aaa"
的类型是const char[]
,可以直接赋值给const char*
类型变量,但不能将其直接赋值给char*
类型变量(有些编译器可以赋值但要避免这样使用),需要使用强制类型转换const_cast<char*>("bbb")
。将字符串常量直接赋值给char[]
类型实际上在内部作了逐个赋值操作
3. C++风格字符串
- string是C++类库中的一个类,存在于名称空间
using std::string
中,使用时需要导入类库#include<string>
。如果使用=
初始化一个变量,执行的是拷贝初始化string s="aaa"
,如果不使用等号,则执行的是直接初始化string s("aaa")
- string类型字符串支持C风格字符串的所有操作,此外还增加了更多功能:①
s.empty()
:判断string是否为空;②s.size(),s.length()
:返回string字符个数,返回值是一个无符号整型(size_type),不能与int进行比较;③s1+s2
:返回s1和s2连接后的结果;④s1==s2,s1!=s2
:返回s1和s2是否相等;⑤<,<=,>,>=
:比较字符串大小;⑥s1.append(s2)
:在末尾添加字符串;⑦s1.find(s2)
:在s1中查找s2位置;⑧s1.insert(n,s2)
:在位置n处插入字符串;⑨s1.replace(n1,n2,s2)
:将位置n1到n2间的字符串替换为s2;⑩s.substr(n,m)
:返回位置n处长度为m的子字符串 - string类型字符串的所有双目操作符可以与C风格字符串混用,若返回值为字符串类型,则返回string类型字符串,若返回值为整型,则返回size_type类型,要定义该类型的变量需要使用
string::size_type x=1
4. 字符串类型转换
- C风格字符串可以直接转为string字符串,反过来string对象要通过
c_str()
成员函数才能转为const char*
类型。如果后续操作改变了string对象的值,c_str()
返回的数组会失效,如果执行完该函数后想一直使用其返回的数组,最好将数组重新拷贝一份 - C++中要将string对象转为
char[]
类型时,首先用c_str()
成员函数转为const char*
,再用strcpy_s(s1,s2)
函数进行拷贝,该函数相较于strcpy()
而言可以保证有效的缓冲区尺寸,避免不可预料的行为