1. 程式人生 > >65)STL中string的知識

65)STL中string的知識

swa while tar ace 找不到 include abcdefg size 開始

技術分享圖片

1)代碼展示:  string是一個類,只不過封裝了 char* 而且還封裝了 很多的字符串操作函數

        技術分享圖片

2)string類的初始化:

      string的構造函數

          2 默認構造函數:

              string(); //構造一個空的字符串string s1。

          2 拷貝構造函數:

              string(const string &str); //構造一個與str一樣的string。如string s1(s2)。

          2 帶參數的構造函數

           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 }

65)STL中string的知識