1. C语言的字符串
C语言没有专门定义字符串数据类型(如其他语言中的string),它用以'/0'结尾的字符数组来表示一个逻辑意义上的字符串。字符串字面值的类型就是const char类型的数组。C语言定义的字符串我们称之为“风格字符串”(C-style character string),而字符串字面值就是该类型的实例。实际上,C风格字符串既不能确切地归结为C语言的类型,也不能归结为C++语言的类型,就是以空字符 null结束的字符数组:
char cStringA[]={'a','b','c'}; //没有null字符,不是C-style的字符串
char cStringB[]={'a','b','c','/0'}; //包含null字符
char cStringC[]="abc"; //自动添加null的结束符
const char *cpString="abc"; //自动添加null的结束符
char *cpString1= cStringA; //指向了字符数组首地址,不是C-style的字符串
char *cpString2= cStringB; //指向含有null的字符数组首地址,是字符串
2. C标准库函数
下面列出了C语言标准库提供的一系列处理C风格字符串的库函数.要使用这些标准库函数,必须包含相应的C头文件。<string.h>是C语言提供的字符串处理标准库。以下是C标准库中常用的字符串处理函数:
strlen(s) //返回s的长度,不包括字符串结束符null
strcmp(s1,s2) //比较两个字符串s1和s2是否相同.若s1与s2相等,返回0;
//若s1大于s2,返回正数;若s1小于s2,则返回负数
strcat(s1,s2) //将字符串s2连接到s1后,并返回s1
strcpy(s1,s2) //将s2复制给s1,并返回s1
strncat(s1,s2,n) //将s2的前n个字符连接到s1后面,并返回s1
strncpy(s1,s2,n) //将s2的前n个字符复制给s1,并返回s1
注意:这些标准库函数不会检查其字符串参数。传递给这些标准库函数例程的指针必须具有非零值,并且指向以null结束的字符数组中的第一个元素.其中一些标准库函数会修改传递给它的字符串,这些函数将假定它们所修改的字符串具有足够大的空间接收本函数新生成的字符,程序员必须确保目标字符串必须足够大.
3. 标准C++的字符串
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作。首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下:
#include //注意这里不是string.h string.h是C字符串头文件
声明一个字符串变量很简单:
string Str;
这样就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:
a) string s; //生成一个空字符串s
b) string s(str) //拷贝构造函数 生成str的复制品
c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分
//当作字符串的初值
d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多
//strlen”的部分作为字符串的初值
e) string s(cstr) //将C字符串作为s的初值
f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
g) string s(num,c) //生成一个字符串,包含num个c字符
h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值
i) s.~string() //销毁所有字符,释放内存
关于Sting类的字符串操作函数在本文最后简单列举一下,要详细了解,大家可以查阅相关资料。
注意:
1.string类是C++标准库中定义的类类型。在C++中将字符串作为一个对象来管理。
2.C++是有命名空间的概念的,标准C++库的命名空间是std。所以C++字符串类也
经常用后面的形式来用:std::string。
4. C++字符串和C字符串的转换
C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’/0’。c_str()返回一个以‘/0’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string 或字符数组内。C++字符串并不以’/0’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。
5. 关于,,的区别
(1) C的字符串头文件是,在C++里这个文件变成了,string前面的c表示这 个是c语言的;而C++的字符串头文件是,是利用的模板实现的,跟原先C的实现方法不一样,但要安全得多。
(2) VC++中有文件,它就是C中的那个;
而文件实际上只是在一个命名空间std中include了,这是因为C++要减少名称污染;所以两个都是可以用的。
(3) 为字符串实现了一个类,而其实是依靠模板做的。使用类,可以将问题局部化,类似于把一个大问题分解成一个个小问题;而且类是具有类型安全的。同时是标准C++类,移植性好,所以最好最好用C++的类。不过在我们嵌入式开发中,特别是硬件相关的开发,尽量使用C风格的字符串。
(4) 特别说明一下,在VC++中除了有string类以外还有CString类,CString类是MFC的类,不搞Windows MFC编程一般用不到这个类。
6. C++标准库string类与STL的关系
STL即标准模板库(Standard Template Library),它包括五大类组件:算法、容器、迭代器、函数对象、适配器。
STL 是C++标准库的一部分,但不是全部。C++标准库是std名字空间中的所有内容,就是那些不带.h的头文件, 如、、。如std::string,及IO流都不属于STL,但它们是STL兼容的,可以应 用迭代器,算法等。虽然std::string和IO流也是模板类,但并不属于STL。
附录:String类的操作函数
begin 得到指向字符串开头的Iterator
end 得到指向字符串结尾的Iterator
rbegin 得到指向反向字符串开头的Iterator
rend 得到指向反向字符串结尾的Iterator
size 得到字符串的大小
length() 和size函数功能相同
max_size 字符串可能的最大大小
capacity 在不重新分配内存的情况下,字符串可能的大小
empty 判断是否为空
operator[] 取第几个元素,相当于数组
c_str 取得C风格的const char* 字符串
data 取得字符串内容地址
operator= 赋值操作符
reserve 预留空间
swap 交换函数
insert 插入字符
append 追加字符
push_back 追加字符
erase 删除字符串
clear 清空字符容器中所有内容
resize 重新分配空间
assign 和赋值操作符一样
replace 替代
copy 字符串到空间
find 查找,返回基于0的索引号
rfind 反向查找
find_first_of 查找包含子串中的任何字符,返回第一个位置
find_first_not_of 查找不包含子串中的任何字符,返回第一个位置
find_last_of 查找包含子串中的任何字符,返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置
substr(n1,len) 得到字符串从n1开始的长度为len的子串
以下为比较字符串(支持所有的关系运算符)
compare 比较字符串
operator+ 字符串链接
operator+= += 操作符
operator== 判断是否相等
operator!= 判断是否不等于
operator< 判断是否小于
operator>> 从输入流中读入字符串
operator<< 字符串写入输出流
getline 从输入流中读入一行