zoukankan      html  css  js  c++  java
  • string类------新标准c++程序设计

    定义:

      string类是STL中basic_string模板实例化得到的模板类。其定义如下:

    typedef basic_string<char>string;

    构造函数: 

      string类有多个构造函数,但没有接收一个整型参数或一个字符型参数的构造函数

    string s1();                                   //s1=""
    string s2("hello");                            //s2="hello"
    string s3(4,'k');                              //s3="kkkk"
    string s4("12345",1,3);                       //s4="234"  即“12345”的从下标1开始,长度为3的子串

    string s5('k'); //非法错的
    string s6(123); //非法错的

    赋值函数:

      可以用char*类型的变量、常量,以及char类型的变量、常量对string对象进行赋值。例如:

    string s1;
    s1="hello";         //s1="hello"
    s2='k';               //s2="k"

    char a[5]="1234";
    s3=a; //s3="1234"

      string类还有assign成员函数,可以用来对string对象赋值。assign成员函数返回对象自身的引用。例如:

    string s1("12345"),s2;
    s3.assign(s1);                       //s3=s1
    s2.assign(s1,1,2);                   //s2="23",即s1的子串(1,2)
    s2.assign(4,'k');                   //s2="kkkk"
    s2.assign("abcde",2,3);             //s2="cde",即“abcde”的子串(2,3)
    
    s2.assign("12345").assign("678");   //返回对自身的引用,可以继续在后面调用assign成员函数 s2="678"                                         

     求字符串长度:

      length成员函数返回字符串的长度。size成员函数可以实现同样的功能。

    返回char类型字符串: 

    string x=“123”;
    x.c_str();               // “123”

    string对象中字符串的连接:

      可以使用“+”和“+=”运算符对string对象执行字符串的连接操作,string类还有append成员函数,也可以用来向字符串后面添加内容。append成员函数返回对象自身的引用。例如:

    string s1("123"),s2("abc");
    s1.append(s2);                            //s1="123abc"
    s1.append(s2,1,2);                       //s1="123abcbc"
    s1.append(3,'k');                        //s1="123abcbckkk"
    s1.append("ABCDE",2,3);                 //s1="123abcbckkkCDE",添加“ABCDE“子串(2,3)

    string对象的比较:

      可以用“<”、"<="、"=="、、“!=”、">="、">"运算符比较string对象。string类还有compare成员函数,可以用来比较字符串.compare成员函数有以下返回值:小于0表示当前的字符串小;等于0表示两个字符串相等;大于0表示另一个字符串小。例如:

    string s1("hello"),s2("hello,world");
    int n=s1.compare(s2);
    n=s1.compare(1,2,s2,0,3);               //比较s1的子串(1,2)和s2的子串(0,3)
    n=s1.compare(0,2,s2);                   //比较s1的子串(0,2)和s2
    n=s1.compare("Hello"); 
    n=s1.compare(1,2,"Hello");              //比较s1的子串(1,2)和"Hello"
    n=s1.compare(1,2,"Hello",1,2);          //比较s1的子串(1,2)和“Hello”的子串(1,2)

    求string对象的子串:

      substr成员函数可以用来求子串(n,m)原型如下:

    string substr(int n=0,int m=string::npos)const
    

      调用时,如果省略m或m超过了字符串的长度,则求出来的子串就是从下标n开始一直到字符串结束的部分。例如:

    string s1="this is ok";
    string s2=s1.substr(2,4);                   //s2="is i"
    s2=s1.substr(2);                            //s2="is is ok"

    交换两个string对象的内容:

      swap成员函数可以交换两个dtring对象的内容。例如:

    string s1("west"),s2("east");
    s1.swap(s2);                                 //s1="east"  s2="west"
    

    查找子串和字符:

      string类有6种查找子串和字符的成员函数,每种函数以不同形式的 find 命名。它们的返回值都是子串或字符在string对象字符串中的位置(即下标   string::size_type 类型的值)。如果查不到,则返回string::npos。string::npos是在string类中定义的一个静态常量。string::nops  原意  no position(无位置),是 unsigned int的最大值 UINT_MAX=4294967295 ,即查找到最后位置也没有匹配。在int 下数值刚好为-1, 也可以理解为 返回不存在的下标。

      这些函数如下:

      find:从前往后查找子串或字符出现的位置。

      rfind:从后往前查找子串或字符出现的位置。

      find_first_of:从前往后查找何处出现另一个字符串中包含的字符。例如:

    s1.find_first_of("abc");   //查找s1zhong第一次出现“abc”中任一字符的位置

      find_last_of:从后往前查找何处出现另一个字符串中包含的字符。

      find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。

      find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。

      下面是string类的查找成员函数的示例程序:

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
      string s1("Source Code");
      int n;
      if((n=s1.find('u'))!=string::npos)                                //查找u出现的位置
      cout<<"1)"<<n<<","<<s1.substr(n)<<endl;              //输出 1)2,urce Code
    
      if(n=s1.find("Source",3)==string::npos)                   //从下表3开始查找"Source",找不到
      cout<<"2)"<<"Not Found"<<endl;                           //输出 2)Not Found
    
      if((n=s1.find("Co"))!=string::npos)                           //查找子串"Co"。能找到,返回"Co"的位置
      cout<<"3)"<<n<<","<<s1.substr(n)<<endl;             //输出 3)7,Code
    
      if((n=s1.find_first_of("ceo"))!=string::npos)            //查找第一次出现"c"、'e'或'0'的位置
      cout<<"4)"<<n<<","<<s1.substr(n)<<endl;          //输出 4)1,ource Code
    
      if((n=s1.find_last_of('e'))!=string::npos)                 //查找最后一个'e'的位置
      cout<<"5)"<<n<<","<<s1.substr(n)<<endl;            //输出 5)10,e
    
      if((n=s1.find_first_not_of("eou",1))!=string::npos) //从下标1开始查找第一次出现非'e','o'或‘u’字符的位置
      cout<<"6)"<<n<<","<<s1.substr(n)<<endl;            //输出 6)3,rec Code
    
      return 0;
    }
    

      

    替换子串:

      replace成员函数可以对string对象中的子串进行替换,返回值为对象自身的引用。例如:

    string s1("Real Steel");
    s1.replace(1,3,"123456",2,4);        //用“123456”的子串(2,4)替换s1的子串(1,3)
    cout<<s1<<endl;                      //输出  R3456 Steel 
    string s2("Harry Potter");
    s2.replace(2,3,5,'0');               //用5个'0'替换子串(2,3)
    cout<<s2<<endl;                      //输出  Ha00000 Potter
    int n=s2.find("00000");              //查找子串“00000”的位置,n=2
    s2.replace(n,5,"XXX");               //将子串(n,5)替换为“XXX”
    cout<<s2<<endl;                      //输出 HaXXX Potter
    

    删除子串:

      erase成员函数可以删除string对象中的子串,返回值为对象自身的引用。例如:

    string s1("Real Steel");
    s1.erase(1,3);                      //删除子串(1,3),此后s1=“R Steel”
    s1.erase(5);                        //删除下标5及其后面的所有字符。此后s1=“R Ste”
    

    插入字符串:

      insert成员函数可以在string对象中插入另一个字符串,返回值为对象自身的引用。例如:

    string s1("Limitless"),s2("00");
    s1.insert(2,"123");                  //在下标2处插入字符串“123”,s1="Lil123mitless“
    s1.insert(3,s2);                     //在下标2处插入s2,s1="Lil0023mitless"
    s1.insert(3,5,'x');                   //在下标3处插入5个'x',s1=”Li1xxxxx0023mitless”

    将string对象作为流处理:

      使用流对象istringstream和ostringstream,可以将string对象当作一个流进行输入输出。这两个类需要包含头文件sstream。示例程序如下:

    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    int main(){
      string src("Avatar 123 5.2 Titanic K");
      istringstream istrStream(src);                   //建立src到istrStream的联系
      string s1, s2;
      int n;  double d;  char c;
      istrStream >> s1 >> n >> d >> s2 >> c;           //把src的内容当做输入流进行读取
      ostringstream ostrStream;
      ostrStream << s1 << endl << s2 << endl << n << endl << d << endl << c <<endl;
      cout << ostrStream.str();
      return 0;
    }

      该程序的输出结果是:

    Avatar
    Titanic
    123
    5.2
    K
    

      第十一行,从输入流istrStream进行读取,过程和从cin读取一样。

      第十二行,将变量的值输出到流ostrStream。输出结果并不会出现在屏幕上,而是被保存在ostrStream对象管理的某处。用ostringstream类的str成员函数能将输出到ostringstream对象中的内容提取出来。

    用STL算法操作string对象:

      string对象也可以看作一个顺序容器,它支持随机访问迭代器,也有begin和end等成员函数。STL中的许多算法也适用于string对象。下面是STl算法操作string对象的程序示例:

    #include<iostream>
    #include<algorithm>
    #include<string>
    using namespace std;
    int main(){
        string s("afgcbed");
        string::iterator p=find(s.begin(),s.end(),'c');
        if(p!=s.end())
            cout<<p-s.begin()<<endl;                  //输出3
        sort(s.begin(),s.end());
        cout<<s<<endl;                                //输出abcdefg
        next_permutation(s.begin(),s.end());
        cout<<s<<endl;                                //输出abcdegf
        return 0;
    }

    注意:

      1、string与字符数组不同的是,一个string对象的大小是固定的,即表达式sizeof(string)的值是固定的,和其中存放的字符串的长度无关。但这个固定的值在不同编译器中不相同。例如,在Dev C++中是4,在vs2010中是32,string对象中并不直接存放字符串,字符串会在别处开辟内存空间存放,string对象值存放该空间的地址,或者再加上其他一些信息。

      2、用普通字符对string对象赋值,普通字符串的内容会被复制到string对象所管理的那片内存空间中。

      3、string对象在比较大小时是按词典序比较的,而且是大小写相关的。由于大写字母的ASCII码小于小写字母的ASCII码(‘A’~‘Z’的ASCII码是0x41~0x5a,‘a’~‘z’的ASCII码是0x61~0x7a),所以Zbc比abc小。

    转载请注明出处:http://www.cnblogs.com/goudanli/p/7664213.html

    新标准c++程序设计

  • 相关阅读:
    沉痛的一天
    PowerBuilder之5年经验谈(一之1)--PB对Unicode的支持
    C# Client API for Sphinx (support to 0.99)
    F#学习笔记基本类型
    F#学习笔记方法
    接口串联
    eclipse 中如何设置注释?
    软件测试过程中手机截屏
    Postan中执行接口时使用JSON数据,那么什么是 JSON?
    MySQL使用dump备份以及恢复备份
  • 原文地址:https://www.cnblogs.com/l2017/p/7664213.html
Copyright © 2011-2022 走看看