在编程入门系列上一讲中鸡啄米说过,存放和处理字符串有两种方式,一种是用字符数组,另一种是用C++标准类string。今天鸡啄米就大概讲下string类及其用法。
C++从C语言继承了用字符数组存放字符串的方式,并且可以使用像strcpy等系统函数来处理字符串,但是这种方式大家应该也感觉不是很方便。数据与处理数据的函数分离开也不符合面向对象的设计思想。为此C++提供了处理字符串的string类,其中封装了字符串的一些属性和操作字符串的函数。
string类位于C++标准库中。C++从C语言中继承了一些系统函数,另外又自己定义了一些模板和类,这些模板和类逻辑上分为六种类型:输入/输出类、容器类与ADT(抽象数据类型)、存储管理类、算法、错误处理和运行环境支持。这些大家了解下就可以了。
C++标准库中的类的声明分别处于不同的头文件中,我们要使用这些类时就要包含相应的头文件。但是不同的编译器头文件也不同,VC++ 4.1以前的版本中头文件名的形式为“*.h”,VC++ 4.2版本开始就使用符合ANSI标准的标准C++库,可以在不同的编译器间移植,头文件就不再有.h扩展名了,比如,原来的iostream.h文件的新版本文件名为iostream,但C++标准库还是保留了来自C语言的18个带有.h扩展名的头文件。我们在软件开发中,可以使用以前的带有.h扩展名的头文件也可以使用新版本的头文件,编译器会自动判断链接哪一个库。但是注意,不能两种文件混着包含,比如,包含了头文件iostream.h,又包含了新版本头文件string,这种情况是不允许的。
在包含了标准C++库中不带.h扩展名的头文件后,必须加入指定名字空间的语句。例如:
#include
using namespace std; // 指定名字空间std
至于名字空间,鸡啄米在博客文章中会讲。这里大家只要记住这种规定就可以了。
string类封装了字符串的属性和操作,这些属性包括:字符序列、字符序列的长度、一个字符的大小等等,还提供了一些对字符串的操作:查找、分配、连接和追加等。
鸡啄米给大家介绍下string类的部分成员函数,这里写的函数原型跟头文件中的不完全一样,是简化版。具体详细信息可以查看msdn。
1.string类的构造函数
string(); // 默认构造函数,创建一个长度为0的字符串
string(const string &ths); // 拷贝构造函数
string(const string &ths, unsigned int pos, unsigned int n); // 从字符串ths的位置pos(第pos+1个字符)开始取n个字符,用来初始化string类的对象。提示:第i个字符的位置为i-1
string(const char *s, unsigned int n); // 用指针s指向的字符串中的前n个字符初始化string类的对象
string(unsigned int n, char c); // 用n个重复的字符c来初始化string类的对象
2.string类的一些常用成员函数
string类有很多成员函数,鸡啄米就不一一讲了,这里只讲几个常用的成员函数。且称成员函数所属对象为“本对象”,其中存放的字符串为“本字符串”。
string append(const char *s); // 将指针s指向的字符串添加到本字符串尾
string assign(const char *s); // 讲指针s指向的字符串赋值给本对象
string& insert(unsigned int p0, const char *s); // 讲s指向的字符串插入到本字符串的位置p0之前
string substr(unsigned int pos, unsigned int n) const; // 从本字符串的位置pos开始取n个字符构成新的字符串对象返回
unsigned int find(const basic_string &str) const; // 在本字符串中查找str并返回第一次出现的位置
unsigned int length() const; // 返回本字符串的长度
void swap(string &str); // 交换本字符串与str的内容
int compare(const string &str) const; // 比较本字符串与字符串str的大小。若两个字符串相等则返回0,若本字符串小于str,则返回负数,若本字符串大于str,则返回正数。
两个字符串str1和str2的比较有几点规则:a.若str1和str2的长度相同,并且字符都相同,则str1与str2相等。b.若str1和str2的字符不完全相同,就比较第一对不相同的字符的ASCII码,ASCII码较小者所属的字符串就是较小的字符串。c.若str1的长度n1小于str2的长度n2,并且str1与str2前n1个字符完全相同,则str1小于str2。
3.string类的操作符
操作符 举例 备注
+ str1+str2 将字符串str1和str2连接成一个字符串
= str1=str2 将str2赋值给str1
+= str1+=str2 相当于str1=str1+str2
== str1==str2 判断str1与str2是否相等
!= str1!=str2 判断str1与str2是否不相等
< str1
> str1>str2 判断str1是否大于str2
>= str1>=str2 判断str1是否大于等于str2
[] str[i] 引用字符串str中位置为i的字符
鸡啄米最后给大家一个string类应用的例子:
#include <string> #include <iostream> using namespace std ; void ShowBoolStr(int n) { cout<<(n? "True": "False")<<endl; } int main() { string str1="www.jizhuomi.com"; string str2="http://jizhuomi.com"; char s1[ ]="/software"; char s2[ ]="/internet"; cout<<"str1为 "<<str1<<endl; cout<<"str2为 "<<str2<<endl; cout<<"s1为 "<<s1<<endl; cout<<"s2为 "<<s2<<endl; cout<<"str1的长度:"<<str1.length()<<endl; cout<<"str1<s1的结果为 "; ShowBoolStr(str1<s1); cout<<"str2>=s2的结果为 "; ShowBoolStr(str2>=s2); str1+=s1; cout<<"str1=str1+s1:"<<str1<<endl; cout<<"str1的长度:"<<str1.length()<<endl; return 0; }
程序运行结果为:
str1为 www.jizhuomi.com
str2为 http://jizhuomi.com
s1为 /software
s2为 /internet
str1的长度:16
str1
str1=str1+s1:www.jizhuomi.com/software
str1的长度:25
关于string类及其用法鸡啄米就讲到这了。如果以后大家从事MFC开发,可能sting类会很少用到,而主要用MFC中的CString类,但操作类似。希望大家以此对标准C++库中的类有初步的认识。有问题可以到鸡啄米博客留言探讨。跟您的交流将促使我们共同进步。