65)STL中string的知識
阿新 • • 發佈:2018-01-14
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 strings2=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的知識