zoukankan      html  css  js  c++  java
  • C++string类




    在C语言中,用0结束的字符数组表示字符串,有些不方便:1)数组定义后大小不能改变;2)存入的内容只能比数组小,不能大,如果不小心存多了,会引起内存的溢出,这些问题让程序员有些郁闷。

    C++的string属于STL(Standard Template Library,标准模板库)中的定义的类,它会随存放字符的长度自动伸缩,程序员不必担心内存溢出的问题,string类还和C语言的字符串之间还可以很方便的转换。

    一、string的声明

    首先,为了在程序中使用string类,必须包含头文件 <string>。如下:

    #include <string>
    

    注意这里不是string.h,string.h是C语言字符串头文件。

    string是一个模板类,位于std命名空间内,为方便使用还需要在程序中增加:

    using namespace std;  // 指定缺省的使名空间。
    string str;       // 创建string对象。
    

    如果不指定命名空间,也就是说没有using namespace std,创建string对象的方法如下:

    std::string str;
    

    示例(book215.cpp)

    /*
     * 程序名:book215.cpp,此程序用于演示C++string类。
     * 作者:C语言技术网(www.freecplus.net) 日期:20190525
    */
    #include <stdio.h> 
    #include <string.h>
    #include <string>
    
    using namespace std;
    
    int main () 
    { 
      char str1[31];   // C语言风格的字符串。
      memset(str1,0,sizeof(str1));
      strcpy(str1,"西施");
    
      string str2;     // C++的string字符串
    
      str2="沉鱼";     // 对str2赋值
      printf("str2=%s
    ",str2.c_str());
    
      // 判断str2和str1是否相等
      if (str2!=str1) printf("str2=%s,str1=%s,不相等。
    ",str2.c_str(),str1);
    
      strcpy(str1,str2.c_str());   // 把string的内容赋值给C语言风格的字符串。
      printf("str1=%s
    ",str1);
    }
    

    运行效果

    在这里插入图片描述

    二、string的重载的操作符

    可以用=直接赋值。

    可以用 ==、>、<、>=、<=、和!=比较字符串。

    可以用+或者+=操作符连接两个字符串。

    可以用[]获取指定位置的字符,类似数组。

    三、最重要的一个成员函数

    const char *c_str();  
    

    string类采用动态分配内存的方式来存放字符串,c_str函数返回这个字符串的地址。

    std::string str1;
    str1="hello world";
    char str2[31];
    strcpy(str2,str1.c_str());
    

    四、string特性描述函数

    可用下列函数来获得string的一些特性。

    int size();             // 返回当前字符串的大小。
    int length();           // 返回当前字符串的长度,注意和size的区别。
    void clear();           // 清空字符串。
    

    五、string的其它成员函数

    string提供了上百个成员函数,非常丰富,丰富得有点眼花,各位自己找资料,有空的时候再研究一下,断章取义的使用。

    六、string的本质

    string是一个类,通过动态分配内存,实现对字符串的存储,我们来看以下代码。

    示例(book216.cpp)

    /*
     * 程序名:book216.cpp,此程序用于演示C++的string类的字符串的地址。
     * 作者:C语言技术网(www.freecplus.net) 日期:20190525
    */
    #include <stdio.h> 
    #include <string>
    
    int main () 
    { 
      std::string str;
    
      str="www";
      printf("%p
    ",str.c_str());
    
      str=str+".freecplus";
      printf("%p
    ",str.c_str());
    
      str="freecplus";
      printf("%p
    ",str.c_str());
    
      str="www.freecplus.net";
      printf("%p
    ",str.c_str());
    }
    

    运行效果

    在这里插入图片描述

    通过以上的例子,我们可以看到,string对象用于存放字符的内存地址是变化的,当前空间如果不足,就重新分配一个新的内存,同时会释放之前的内存,不是什么神奇的技术。

    七、应用经验

    C++的string类是一个变长的字符串,不需要程序员担心内存溢出的问题,还提供了很多字符串操作函数,初学者可能会想,用它取代C语言中的字符串(以0结尾的字符数组)一定是个很好的主意。我要告诉各位,这是不可能的,因为string中的字符串存储的内存空间没有固定的位置(它也没办法有固定位置)。

    对初学者来说,用C/C++写一些简单的程序,做一些简单的事情,不懂得实际项目开发的需求,例如Oracle和MySQL数据库提供的接口,在交换数据的时候需要绑定一个固定的地址,string是做不到的。

    我的建议是采用string存放一些需要动态分配内存的临时数据,避开动态内存技术带来的坑,然后转换为C的字符串。C的字符串没有string类那么丰富的成员函数,这个不是问题,我们可以自己写,这也是我不想介绍string成员函数的原因,与其花时间去研究string的成员函数,还不如自己写一个。

    了解string类的原理和一些用得着的成员函数就可以了,不必太深入研究,意义不大。

    八、课后作业

    上网找C++string的资料,看看它的成员函数和重载的操作符,如果觉得有用,就编写代码测试一下,了解一下大概情况。

    九、版权声明

    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
    来源:C语言技术网(www.freecplus.net)
    作者:码农有道

    如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!

  • 相关阅读:
    centos7下编译安装python3.7,且与python2.7.5共存
    Linux下的ctrl常用组合键
    命令 docker rm | docker rmi | docker prune 的差异
    docker操作命令大全和后台参数
    解决Linux下ssh登录后出现 报错 Write failed: Broken pipe 的方法
    在centos7 中docker info报错docker bridge-nf-call-iptables is disabled 的解决方法
    Linux下实现不活动用户登录超时后自动登出
    centos下非yum方式安装docker环境
    Git Error:There is no tracking information for the current branch.
    Vim操作:打开文件
  • 原文地址:https://www.cnblogs.com/wucongzhou/p/12498288.html
Copyright © 2011-2022 走看看