C++字符串详解
C++ 大大增強了對字符串的支持,除了可以使用C風格的字符串,還可以使用內置的 string 類。string 類處理起字符串來會方便很多,完全可以代替C語言中的字符數組或字符串指針。
使用 string 類需要包含頭文件,介紹幾種定義 string 變量(對象)的方法:
#include <iostream> #include <string> using namespace std;int main(){string s1;string s2 = "c plus plus";string s3 = s2;string s4 (5, 's');return 0; }變量 s1 只是定義但沒有初始化,編譯器會將默認值賦給 s1,默認值是"",也即空字符串。
變量 s2 在定義的同時被初始化為"c plus plus"。與C風格的字符串不同,string 的結尾沒有結束標志’\0’。
變量 s3 在定義的時候直接用 s2 進行初始化,因此 s3 的內容也是"c plus plus"。
變量 s4 被初始化為由 5 個’s’字符組成的字符串,也就是"sssss"。
從上面的代碼可以看出,string 變量可以直接通過賦值操作符=進行賦值。string 變量也可以用C風格的字符串進行賦值,例如,s2 是用一個字符串常量進行初始化的,而 s3 則是通過 s2 變量進行初始化的。
我們需要知道字符串長度時,可以調用 string 類提供的 length() 函數。如下所示:
string s = "http://ww.baidu.com"; int len = s.length(); cout<<len<<endl;輸出結果為19。由于 string 的末尾沒有’\0’字符,所以 length() 返回的是字符串的真實長度,而不是長度 +1。
轉換為C風格的字符串
string 類為我們提供了一個轉換函數 c_str(),該函數能夠將 string 字符串轉換為C風格的字符串,并返回該字符串的 const 指針(const char*)。請看下面的代碼:
string path = "D:\\demo.txt";FILE *fp = fopen(path.c_str(), "rt");為了使用C語言中的 fopen() 函數打開文件,必須將 string 字符串轉換為C風格的字符串。
string 字符串的輸入輸出
string 類重載了輸入輸出運算符,可以像對待普通變量那樣對待 string 變量,也就是用>>進行輸入,用<<進行輸出。請看下面的代碼:
#include <iostream> #include <string>using namespace std;int main(){string s;cin>>s; //輸入字符串cout<<s<<endl; //輸出字符串return 0; }運行結果:
http://www.baidu.com http://www.sougou.com //輸入內容 http://www.baidu.com //輸出內容雖然我們輸入了兩個由空格隔開的網址,但是只輸出了一個,這是因為輸入運算符>>默認會忽略空格,遇到空格就認為輸入結束,所以最后輸入的http://http://www.sougou.com沒有被存儲到變量 s。
訪問字符串中的字符
string 字符串也可以像C風格的字符串一樣按照下標來訪問其中的每一個字符。string 字符串的起始下標仍是從 0 開始。請看下面的代碼:
#include <iostream> #include <string> using namespace std;int main(){string s = "1234567890";for(int i=0,len=s.length(); i<len; i++){cout<<s[i]<<" ";}cout<<endl;s[5] = '5';cout<<s<<endl;return 0; }運行結果:
1 2 3 4 5 6 7 8 9 0 1234557890本例定義了一個 string 變量 s,并賦值 “1234567890”,之后用 for 循環遍歷輸出每一個字符。借助下標,除了能夠訪問每個字符,也可以修改每個字符,s[5] = ‘5’;就將第6個字符修改為 ‘5’,所以 s 最后為 “1234557890”。
字符串的拼接
有了 string 類,我們可以使用+或+=運算符來直接拼接字符串,非常方便。
用+來拼接字符串時,運算符的兩邊可以都是 string 字符串,也可以是一個 string 字符串和一個C風格的字符串,還可以是一個 string 字符串和一個字符數組,或者是一個 string 字符串和一個單獨的字符。請看下面的例子:
#include <iostream> #include <string> using namespace std;int main(){string s1 = "first ";string s2 = "second ";char *s3 = "third ";char s4[] = "fourth ";char ch = '@';string s5 = s1 + s2;string s6 = s1 + s3;string s7 = s1 + s4;string s8 = s1 + ch;cout<<s5<<endl<<s6<<endl<<s7<<endl<<s8<<endl;return 0; }運行結果:
first second first third first fourth first @string 字符串的增刪改查
C++ 提供的 string 類包含了若干實用的成員函數,大大方便了字符串的增加、刪除、更改、查詢等操作。
一. 插入字符串
insert() 函數可以在 string 字符串中指定的位置插入另一個字符串,它的一種原型為:
pos 表示要插入的位置,也就是下標;str 表示要插入的字符串,它可以是 string 字符串,也可以是C風格的字符串。
請看下面的代碼:
#include <iostream> #include <string> using namespace std;int main(){string s1, s2, s3;s1 = s2 = "1234567890";s3 = "aaa";s1.insert(5, s3);cout<< s1 <<endl;s2.insert(5, "bbb");cout<< s2 <<endl;return 0; }運行結果:
12345aaa67890 12345bbb67890insert() 函數的第一個參數有越界的可能,如果越界,則會產生運行時異常。
二. 刪除字符串
erase() 函數可以刪除 string 中的一個子字符串。它的一種原型為:
pos 表示要刪除的子字符串的起始下標,len 表示要刪除子字符串的長度。如果不指明 len 的話,那么直接刪除從 pos 到字符串結束處的所有字符(此時 len = str.length - pos)。
請看下面的代碼:
#include <iostream> #include <string> using namespace std;int main(){string s1, s2, s3;s1 = s2 = s3 = "1234567890";s2.erase(5);s3.erase(5, 3);cout<< s1 <<endl;cout<< s2 <<endl;cout<< s3 <<endl;return 0; }運行結果:
1234567890 12345 1234590在 pos 參數沒有越界的情況下, len 參數也可能會導致要刪除的子字符串越界的情況是不可能發生的, 因為erase() 函數會從以下兩個值中取出最小的一個作為待刪除子字符串的長度:
len 的值;字符串長度減去 pos 的值。待刪除字符串最多只能刪除到字符串結尾。
三. 提取子字符串
substr() 函數用于從 string 字符串中提取子字符串,它的原型為:
string substr (size_t pos = 0, size_t len = npos) const;pos 為要提取的子字符串的起始下標,len 為要提取的子字符串的長度。
請看下面的代碼:
#include <iostream> #include <string> using namespace std;int main(){string s1 = "first second third";string s2;s2 = s1.substr(6, 6);cout<< s1 <<endl;cout<< s2 <<endl;return 0; }運行結果:
first second third second系統對 substr() 參數的處理和 erase() 類似:
如果 pos 越界,會拋出異常;如果 len 越界,會提取從 pos 到字符串結尾處的所有字符。四. 字符串查找
1 find() 函數
find() 函數用于在 string 字符串中查找子字符串出現的位置,它其中的兩種原型為:
第一個參數為待查找的子字符串,它可以是 string 字符串,也可以是C風格的字符串。第二個參數為開始查找的位置(下標);如果不指明,則從第0個字符開始查找。
請看下面的代碼:
#include <iostream> #include <string> using namespace std;int main(){string s1 = "first second third";string s2 = "second";int index = s1.find(s2,5);if(index < s1.length())cout<<"Found at index : "<< index <<endl;elsecout<<"Not found"<<endl;return 0; }運行結果:
Found at index : 6find() 函數最終返回的是子字符串第一次出現在字符串中的起始下標。
2 rfind() 函數
rfind() 和 find() 很類似,同樣是在字符串中查找子字符串,不同的是 find() 函數從第二個參數開始往后查找,而 rfind() 函數則最多查找到第二個參數處,如果到了第二個參數所指定的下標還沒有找到子字符串,則返回一個無窮大值4294967295。
請看下面的例子:
#include <iostream> #include <string> using namespace std;int main(){string s1 = "first second third";string s2 = "second";int index = s1.rfind(s2,6);if(index < s1.length())cout<<"Found at index : "<< index <<endl;elsecout<<"Not found"<<endl;return 0; }運行結果:
Found at index : 63 find_first_of() 函數
find_first_of() 函數用于查找子字符串和字符串共同具有的字符在字符串中首次出現的位置。請看下面的代碼:
運行結果:
Found at index : 3s1 和 s2 共同具有的字符是 ’s’,該字符在 s1 中首次出現的下標是3,故查找結果返回3。
總結
- 上一篇: Spring JDK动态代理
- 下一篇: C++变量位置