在编程入门系列上一讲中鸡啄米说过,存放和处理字符串有两种方式,一种是用字符数组,另一种是用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      // 包含iostream头文件
       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类的对象

鸡啄米: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
          >=               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       str2>=s2的结果为 True
       str1=str1+s1:www.jizhuomi.com/software
       str1的长度:25

       关于string类及其用法鸡啄米就讲到这了。如果以后大家从事MFC开发,可能sting类会很少用到,而主要用MFC中的CString类,但操作类似。希望大家以此对标准C++库中的类有初步的认识。有问题可以到鸡啄米博客留言探讨。跟您的交流将促使我们共同进步。