1. 程式人生 > >C++之string基本字符系列容器

C++之string基本字符系列容器

using rtt 對象的比較 負數 字符指針 string對象 很多 ret c_str

string基本字符系列容器 C語言只提供了一個插入類型用來處理字符, 而對於字符串, 只能通過字符串數組來處理, 顯得十分不便. C++STL提供了string基本字符系列容器來處理字符串, 可以把string理解為字符串類, 它提供了添加, 刪除, 替換, 查找和比較等豐富的方法. 雖然使用vector<char>這樣的向量也可以處理字符串, 但功能比不上string. 向量的元素類型可以是string, 如vector<string>這樣的向量, 實際上就類似於C語言中的字符串數組. 使用string容器, 需要頭文件包含聲明"#include<string>" 1.1創建string對象 下面這條語句創建了字符串對象s, s是一個空字符串, 其長度為0: #include<iostream> #include<string> using namespace std; int main() { string s; cout << s.length() << endl; return 0; } 1.2給string對象賦值 給string對象賦值一般有兩種方式 (1)直接給字符串對象賦值, 如: #include<string> #include<iostream> using namespace std; int main() { string s; s = "hello, C++STL."; cout << s << endl; return 0; } (2)更常用的方法是, 把字符指針賦給一個字符串對象: #include<string> #include<iostream> using namespace std; int main() { string s; char ss[5000]; //scanf的輸入速度比cin快得多 //scanf是C語言的函數, 不支持string對象 scanf("%s", &ss); //把整個字符數組賦值給string對象 s = ss; //輸出字符對象 cout << s << endl; return 0; } 1.3從string對象尾部添加字符 在string對象的尾部添加一個字符(char), 采用"+"操作符即可, 具體應用如下: #include<string> #include<iostream> using namespace std; int main() { string s; s = s + ‘a‘; s = s + ‘b‘; s = s + ‘c‘; cout << s << endl; return 0; } 1.4從string對象尾部追加字符串 從尾部追加的方式有兩種 (1)直接采用"+"操作符, 代碼如下: #include<string> #include<iostream> using namespace std; int main() { string s; s = s + "abc"; s = s + "123"; cout << s << endl; return 0; } (2)采用append()方法, 代碼如下: #include<string> #include<iostream> using namespace std; int main() { string s; s.append("abc"); s.append("123"); cout << s << endl; return 0; } 1.5給string對象插入字符 可以使用insert()方法把一個字符插入到叠代器位置之前, 代碼如下: #include<string> #include<iostream> using namespace std; int main() { string s; s = "123456"; //定義叠代器 string::iterator it; //叠代器位置為字符串首 it = s.begin(); //把字符‘p‘插入到第一個字符前(註意, 字符位置是從0開始計數) s.insert(it + 1, ‘p‘); cout << s << endl; return 0; } 1.6訪問string對象的元素 一般使用下標方式隨機訪問string對象的元素, 下標是從0開始計數的. 另外, string對象的元素是一個字符(char), 這一點一定要清楚. 代碼如下: #include<string> #include<iostream> using namespace std; int main() { string s; s = "abc123456"; //輸出string對象的首元素 cout << s[0] << endl; //兩個相同的字符相減值為0 cout << s[0] - ‘a‘ << endl; return 0; } 1.7刪除string對象的元素 (1)清空一個字符串, 則直接給它賦空字符串即可. (2)使用erase()方法刪除叠代器所指的那個元素或一個區間中的所有元素. 代碼如下: #include<string> #include<iostream> using namespace std; int main() { string s; s = "abc123456"; //定義叠代器變量, 指向字符串對象的首元素 string::iterator it = s.begin(); //刪除第3個元素, 元素位置從0開始計數 s.erase(it + 3); cout << s << endl; //刪除0~4區間的所有元素 s.erase(it, it + 4); cout << s << endl; //清空字符串 s = ""; //輸出字符串的長度 cout << s.length() << endl; return 0; } 1.8返回string對象的長度 采用length()方法可返回字符串的長度; 采用empty()方法, 可返回字符串是否為空, 如果字符串為空, 則返回邏輯真, 即1, 否則, 返回邏輯假, 即0. 代碼如下: #include<string> #include<iostream> using namespace std; int main() { string s; s = "abc123456"; //輸出字符串的長度 cout << s.length() << endl; //清空字符串 s = ""; //判斷字符串是否為空 cout << s.empty() << endl; return 0; } 1.9替換string對象的字符 使用replace()方法很方便的替換string對象中的字符, replace()方法的重載函數相當多, 常用的只有一兩個, 具體代碼如下: #include<string> #include<iostream> using namespace std; int main() { string s; s = "abc123456"; //從第3個開始, 將連續的3個字符替換為"good" //即將"abc"替換為"good" s.replace(3, 3, "good"); cout << s << endl; return 0; } /* abcgood456 */ 1.10搜索string對象的元素或字串 采用find()方法可查找字符串中的第一個字符元素(char, 用單引號界定)或者子串(用雙引號界定), 如果查到, 則返回下標值(從0開始計數), 如果查不到, 則返回4294967295. find()方法有很多重載函數, 下面的代碼, 僅舉出了一種用法. #include<string> #include<iostream> using namespace std; int main() { string s; s = "cat dog cat"; //查找第一個字符‘c‘, 返回下標值 cout << s.find(‘c‘) << endl; //查找第一個子串"c", 返回下標值 cout << s.find("c") << endl; //查找第一個子串"cat", 返回下標值 cout << s.find("cat") << endl; //查找第一個子串"dog", 返回下標值 cout << s.find("dog") << endl; //查找第一個子串"dogc", 查不到則返回4294967295 cout << s.find("dogc") << endl; return 0; } /* 0 0 0 4 18446744073709551615 */ 1.11string對象的比較 string對象可以使用compare()方法與其他字符串相比較. 如果它比對方大, 則返回1(整數); 如果它比對方小, 則返回-1(負數); 如果它與對方相等, 則返回0. 代碼如下: #include<string> #include<iostream> using namespace std; int main() { string s; s = "cat dog cat"; //s比"cat"字符串大, 返回1 cout << s.compare("cat") << endl; //s與"cat dog cat"相等, 返回0 cout << s.compare("cat dog cat") << endl; //s比"dog"小, 返回-1 cout << s.compare("dog") << endl; return 0; } /* 8 0 -1 */ 1.12用reverse反向排序string對象 采用reverse()方法可將string對象叠代器所指向的一段區間中的元素(字符)反向排序. reverse()方法需要聲明頭文件"#include<algorithm>". 代碼如下: #include<string> #include<algorithm> #include<iostream> using namespace std; int main() { string s; s = "123456789"; reverse(s.begin(), s.end()); cout << s << endl; return 0; } /* 987654321 */ 1.13string對象作為vector元素 string對象可以作為vector向量的元素, 這種用法, 類似於字符串數組, 代碼如下: #include<vector> #include<string> #include<iostream> #include<algorithm> using namespace std; int main() { vector<string> v; v.push_back("Jack"); v.push_back("Mike"); v.push_back("Tom"); cout << v[0] << endl; cout << v[1] << endl; cout << v[2] << endl; cout << v[0][0] << endl; cout << v[1][0] << endl; cout << v[2].length() << endl; return 0; } /* Jack Mike Tom J M 3 */ 1.14string類型的數字化處理 在ACM競賽中, 常常需要將讀入的數字的每位分離出來, 如果采用取余的方法, 花費的時間就會很長, 這時候, 我們可以將讀入的數據當成字符串來處理, 這樣就方便, 省時多了, 下面這個程序演示了求一個整數各位的和: #include<string> #include<iostream> using namespace std; int main() { string s; s = "123456789"; int i; int sum = 0; for(i = 0; i < s.length(); ++i) { if(s[i] == ‘0‘) sum += 0; else if(s[i] == ‘1‘) sum += 1; else if(s[i] == ‘2‘) sum += 2; else if(s[i] == ‘3‘) sum += 3; else if(s[i] == ‘4‘) sum += 4; else if(s[i] == ‘5‘) sum += 5; else if(s[i] == ‘6‘) sum += 6; else if(s[i] == ‘7‘) sum += 7; else if(s[i] == ‘8‘) sum += 8; else if(s[i] == ‘9‘) sum += 9; } cout << sum << endl; return 0; } /* 45 */ 1.15string對象與字符數組互操作 下面這個程序演示了字符數組與string對象的輸入與輸出: #include<string> #include<iostream> using namespace std; int main() { string s; char ss[100]; //輸入字符串到字符數組中 scanf("%s", &ss); //字符數組賦值給字符串對象 s = ss; //用printf輸出字符串對象, 要采用c_str()方法 printf(s.c_str()); cout << endl; printf("%s", ss); cout << endl; cout << s << endl; cout << ss << endl; return 0; } /* input: abc123 output: abc123 abc123 abc123 abc123 */ 1.16string對象與sscanf函數 在C語言中, sscanf函數很管用, 它可以把一個字符串按你需要的方式分離出子串, 甚至是數字 下面這個程序演示了sscanf函數的具體用法: #include<string> #include<iostream> using namespace std; int main() { string s1, s2, s3; char sa[100], sb[100], sc[100]; //將字符串分離成子串, 分隔符為空格 sscanf("abc 123 pc", "%s %s %s", sa, sb, sc); s1 = sa; s2 = sb; s3 = sc; cout << s1 << " " << s2 << " " << s3 << endl; //將字符串分離成數字, 分隔符為空格 //當用到數字的時候, 跟scanf一樣, 它要傳指針地址 int a, b, c; sscanf("1 2 3", "%d %d %d", &a, &b, &c); cout << a << " " << b << " " << c << endl; //將字符串分離成數字, 分隔符為","和"$" //當用到數字的時候, 跟scanf一樣, 它要傳指針地址 int x, y, z; sscanf("4,5$6", "%d,%d$%d", &x, &y, &z); cout << x << " " << y << " " << z << endl; return 0; } /* abc 123 pc 1 2 3 4 5 6 */ 1.17string對象與數值相互轉換 有時候, string對象與數值之間需要相互轉換, 下面這個例子詳細說明了如何完成該工作的: #include<iostream> #include<string> #include<sstream> using namespace std; //C++方法: 將數值轉換為string string convertToString(double x) { ostringstream o; if(o << x) return o.str(); return "conversion error";//if error } //C++方法: 將string轉換為數值 double convertFromString(const string &s) { istringstream i(s); double x; if(i >> x) return x; return 0.0;//if error } int main() { //將數值轉換為string的第一種方法: C方法 char b[10]; string a; sprintf(b, "%d", 1975); a = b; cout << a << endl; //將數值轉換為string的第二種方法: C++方法 string cc = convertToString(1976); cout << cc << endl; //將string轉換為數值的方法: C++方法 string dd = "2006"; int p = convertFromString(dd) + 2; cout << p << endl; return 0; } /* 1975 1976 2008 */

C++之string基本字符系列容器