65)STL中string的知识

 

1)代码展示:  string是一个类,只不过封装了 char*  而且还封装了  很多的字符串操作函数

        

 

2)string类的初始化:

      string的构造函数

          ²  默认构造函数:

              string();       //构造一个空的字符串string s1。

          ²  拷贝构造函数:

              string(const string &str);         //构造一个与str一样的string。如string s1(s2)。

          ²  带参数的构造函数

                         string(const char *s);    //用字符串s初始化

                         string(int n,char c);    //用n个字符c初始化

 1 #include<iostream>
 2 
 3 #include<string>
 4 using namespace std;
 5 //字符串对象的初始化
 6 void hanshu()
 7 {
 8     string s1="dhajds";
 9     string s2=string("dhskad");
10     string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
11     string s4=string('a',4);//用4个a对s4进行初始化
12 }

 

4)字符串的遍历

    总共是三种,其中那个at()是可以抛出异常,我们可以捕捉的:
  

 1 #include<iostream>
 2 
 3 #include<string>
 4 using namespace std;
 5 //字符串对象的初始化
 6 void hanshu()
 7 {
 8     string s1="dhajds";
 9     string s2=string("dhskad");
10     string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
11     string s4=string('a',4);//用4个a对s4进行初始化
12 }
13 //字符串的遍历
14 void bianli(string s)
15 {
16     //第一种,因为字符串重载了数组操作符  所以可以像遍历数组那样,进行遍历
17 
18     //数组方式
19     cout<<"数组方式来进行遍历字符串"<<endl;
20     for(int i=0;i<s.length();i++)
21     {
22     cout<<s[i]<<endl;
23     }
24 
25     ///第二种是  通过迭代器
26     cout<<"迭代器方式来进行遍历字符串"<<endl;
27     for(string::iterator t=s.begin();t<s.end();t++)
28     {
29         cout<<*t<<endl;
30     }
31 
32     //第三种,用at方式
33     cout<<"用at方式遍历字符串"<<endl;
34     try{
35             for(int i=0;i<s.length();i++)
36             {
37                 cout<<s.at(i)<<endl;//抛出异常
38             }
39         }
40     catch(...){
41         cout<<"发出异常"<<endl;
42     }
43 
44 }
45 int main()
46 {
47     string s="abcdefghijklmn";
48     bianli(s);
49     return 0;
50 }

 

      然后 ,加入我的代码发生了问题,比如  我的  数组遍历方式有问题  

 1 #include<iostream>
 2 
 3 #include<string>
 4 using namespace std;
 5 //字符串对象的初始化
 6 void hanshu()
 7 {
 8     string s1="dhajds";
 9     string s2=string("dhskad");
10     string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
11     string s4=string('a',4);//用4个a对s4进行初始化
12 }
13 //字符串的遍历
14 void bianli(string s)
15 {
16     //第一种,因为字符串重载了数组操作符  所以可以像遍历数组那样,进行遍历
17 
18     //数组方式
19     cout<<"数组方式来进行遍历字符串"<<endl;
20     for(int i=0;i<s.length()+3;i++)//我这里i多了3,越界了
21     {
22     cout<<s[i]<<endl;
23     }
24 
25 }
26 int main()
27 {
28     string s="abcdefghijklmn";
29     bianli(s);
30     return 0;
31 }

    最后结果展示  直接代码崩掉

然后你再看我的at(),有异常抛出的代码处理问题的方式:
  

 1 #include<iostream>
 2 
 3 #include<string>
 4 using namespace std;
 5 //字符串对象的初始化
 6 void hanshu()
 7 {
 8     string s1="dhajds";
 9     string s2=string("dhskad");
10     string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
11     string s4=string('a',4);//用4个a对s4进行初始化
12 }
13 //字符串的遍历
14 void bianli(string s)
15 {
16     //第三种,用at方式
17     cout<<"用at方式遍历字符串"<<endl;
18     try{
19             for(int i=0;i<s.length()+3;i++)
20             {
21                 cout<<s.at(i)<<endl;//抛出异常
22             }
23         }
24     catch(...){
25         cout<<"发出异常"<<endl;
26     }
27 
28 }
29 int main()
30 {
31     string s="abcdefghijklmn";
32     bianli(s);
33     return 0;
34 }

      结果展示:
    

 

5)字符串:字符指针和string类的转换

     

         

     copy 不会在 拷贝的字符后面加 '\0'  所以  要自己加上,而且  最好 char buf【128】={0},这样初始化

 

 

6)字符串的赋值

    

1 string &operator=(const string &s);//把字符串s赋给当前的字符串
2 string &assign(const char *s); //把字符串s赋给当前的字符串
3 string &assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
4 string &assign(const string &s);  //把字符串s赋给当前字符串
5 string &assign(int n,char c);  //用n个字符c赋给当前字符串
6 string &assign(const string &s,int start, int n);  //把字符串s中从start开始的n个字符赋给当前字符串

 

7)字符串的拼接:

1 string &operator+=(const string &s);  //把字符串s连接到当前字符串结尾
2 string &operator+=(const char *s);//把字符串s连接到当前字符串结尾
3 string &append(const char *s);    //把字符串s连接到当前字符串结尾
4 string &append(const char *s,int n);  //把字符串s的前n个字符连接到当前字符串结尾
5 string &append(const string &s);   //同operator+=()
6 string &append(const string &s,int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
7 string &append(int n, char c);   //在当前字符串结尾添加n个字符c

 

8)与字符串比较

 

1 int compare(const string &s) const;  //与字符串s比较
2 int compare(const char *s) const;   //与字符串s比较
3 compare函数在>时返回 1,<时返回 -1,==时返回 0。比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的A比小写的a小。

 

 

9)字符串的子串

      string substr(int pos=0, int n=npos) const;    //返回由pos开始的n个字符组成的子字符串

1 string s="abcdefghijklmn";
2 cout<<s.substr(0,4)<<endl;

 

10)字符串的查找和替换

 

 1 查找
 2 int find(char c,int pos=0) const;  //从pos开始查找字符c在当前字符串的位置 
 3 int find(const char *s, int pos=0) const;  //从pos开始查找字符串s在当前字符串的位置
 4 int find(const string &s, int pos=0) const;  //从pos开始查找字符串s在当前字符串中的位置
 5 find函数如果查找不到,就返回-1
 6 int rfind(char c, int pos=npos) const;   //从pos开始从后向前查找字符c在当前字符串中的位置 
 7 int rfind(const char *s, int pos=npos) const;
 8 int rfind(const string &s, int pos=npos) const;
 9 //rfind是反向查找的意思,如果查找不到, 返回-1
10 
11 替换
12 string &replace(int pos, int n, const char *s);//删除从pos开始的n个字符,然后在pos处插入串s
13 string &replace(int pos, int n, const string &s);  //删除从pos开始的n个字符,然后在pos处插入串s
14 void swap(string &s2);    //交换当前字符串与s2的值
15 
16 //4 字符串的查找和替换
17 void main25()
18 {
19     string s1 = "wbm hello wbm 111 wbm 222 wbm 333";
20     size_t index = s1.find("wbm", 0);
21     cout << "index: " << index; 
22 
23 
24     //求itcast出现的次数
25     size_t offindex = s1.find("wbm", 0);
26     while (offindex != string::npos)
27     {
28         cout << "在下标index: " << offindex << "找到wbm\n";
29         offindex = offindex + 1;
30         offindex = s1.find("wbm", offindex);
31     }
32 
33     //替换 
34     string s2 = "wbm hello wbm 111 wbm 222 wbm 333";
35     s2.replace(0, 3, "wbm");
36     cout << s2 << endl;
37 
38     //求itcast出现的次数
39     offindex = s2.find("wbm", 0);
40     while (offindex != string::npos)
41     {
42         cout << "在下标index: " << offindex << "找到wbm\n";
43         s2.replace(offindex, 3, "WBM");
44         offindex = offindex + 1;
45         offindex = s1.find("wbm", offindex);
46     }
47     cout << "替换以后的s2:" << s2 << endl; 
48 }

 

11)字符串的区间删除和插入

 

1 string &insert(int pos, const char *s);
2 string &insert(int pos, const string &s);
3 //前两个函数在pos位置插入字符串s
4 string &insert(int pos, int n, char c);  //在pos位置 插入n个字符c
5 
6 string &erase(int pos=0, int n=npos);  //删除pos开始的n个字符,返回修改后的字符串

 

12)字符串的算法相关

 

 1 void main27()
 2 {
 3     string s2 = "AAAbbb";
 4     transform(s2.begin(), s2.end(), s2.begin(), toupper);
 5     cout << s2 << endl;
 6 
 7     string s3 = "AAAbbb";
 8     transform(s3.begin(), s3.end(), s3.begin(), tolower);
 9     cout << s3 << endl;
10 }

 

posted @ 2018-01-14 14:35  小油菜1  阅读(136)  评论(0编辑  收藏  举报