转载:c+string类详解
C++ string 類詳解
</h1><div class="clear"></div><div class="postBody">字符串是存儲(chǔ)在內(nèi)存的連續(xù)字節(jié)中的一系列字符。C++ 處理字符串的方式有兩種,一種來(lái)自 C 語(yǔ)言,常被稱為 C-風(fēng)格字符串,另一種是基于 string 類庫(kù)的字符串處理方式。C 風(fēng)格字符串的處理可以參考?https://www.cnblogs.com/tongye/p/10688941.html?,本文著重介紹 string 類庫(kù)的使用。
一、string 類簡(jiǎn)介
C++ 中提供了專門的頭文件 string(注意不是 string.h,這個(gè)是 C 風(fēng)格字符串相關(guān)函數(shù)的頭文件),來(lái)支持 string 類型。string 類定義隱藏了字符串的數(shù)組性質(zhì),讓我們可以像處理普通變量那樣處理字符串。string 對(duì)象和字符數(shù)組之間的主要區(qū)別是:可以將 string 對(duì)象聲明為簡(jiǎn)單變量,而不是數(shù)組。
1.1 string 類幾種常見(jiàn)的構(gòu)造函數(shù):
1)string(const char *s) :將 string 對(duì)象初始化為 s 指向的字符串
string str("Hello!");2)string(size_type n,char c) :創(chuàng)建一個(gè)包含 n 個(gè)元素的 string 對(duì)象,其中每個(gè)元素都被初始化為字符 c
string str(10,'a');3)string(const string &str) :將一個(gè) string 對(duì)象初始化為 string 對(duì)象 str(復(fù)制構(gòu)造函數(shù))
string str1("hello!"); string str2(str1);4)string() :創(chuàng)建一個(gè)默認(rèn)的 string 對(duì)象,長(zhǎng)度為 0(默認(rèn)構(gòu)造函數(shù))
string str; // 創(chuàng)建一個(gè)空的 string 對(duì)象string 類的設(shè)計(jì)允許程序自動(dòng)處理 string 的大小,因此,上述代碼創(chuàng)建了一個(gè)長(zhǎng)度為 0 的string 對(duì)象,但是向 str 中寫入數(shù)據(jù)時(shí),程序會(huì)自動(dòng)調(diào)整 str 的長(zhǎng)度。因此,與使用數(shù)組相比,使用 string 對(duì)象更方便,也更安全。
?
1.2 用 C 語(yǔ)言風(fēng)格初始化 string 對(duì)象:
C++ 允許使用 C 語(yǔ)言風(fēng)格來(lái)初始化 string 對(duì)象:
string str = "hello!";?
二、獲取 string 對(duì)象的長(zhǎng)度
在 C 語(yǔ)言中,使用 strlen 函數(shù)獲取字符串的長(zhǎng)度。在 C++ 中,可以使用 string.size() 函數(shù)或 string.length() 函數(shù)來(lái)獲得 string 對(duì)象的長(zhǎng)度。在 C++ 標(biāo)準(zhǔn)庫(kù)中,兩者的源代碼如下:
size_type __CLR_OR_THIS_CALL length() const { // return length of sequence return (_Mysize); }size_type __CLR_OR_THIS_CALL size() const
{ // return length of sequence
return (_Mysize);
}
? 可見(jiàn),這兩個(gè)方法是完全一樣的,并沒(méi)有區(qū)別。length() 方法是 C 語(yǔ)言習(xí)慣保留的,size() 方法則是為了兼容 STL 容器而引入的。
string str("Hello,World!"); int strLen1 = str.length(); int strLen2 = str.size();?
三、復(fù)制 string 對(duì)象
在 C 語(yǔ)言中,使用 strcpy、strncpy 函數(shù)來(lái)實(shí)現(xiàn)字符串的復(fù)制。在 C++ 中則方便很多,可以直接將一個(gè) string 對(duì)象賦值給另一個(gè) string 對(duì)象,即:
string str1("Hello,World!"); string str2; str2 = str1;由于 string 類會(huì)自動(dòng)調(diào)整對(duì)象的大小,因此不需要擔(dān)心目標(biāo)數(shù)組不夠大的問(wèn)題。
?
四、string 對(duì)象的拼接和附加
在 C 語(yǔ)言中,使用 strcat、strncat 函數(shù)來(lái)進(jìn)行字符串拼接操作。在 C++ 中也有多種方法來(lái)實(shí)現(xiàn)字符串拼接和附加操作:
4.1 使用 + 操作符拼接兩個(gè)字符串
string str1("hello "); string str2("world!"); string str3 = str1 + str2;4.1 使用 += 操作符在字符串后面附加內(nèi)容
可以使用 += 來(lái)在一個(gè) string 對(duì)象后面附加一個(gè) string 對(duì)象、字符以及 C 風(fēng)格的字符串:
string str1("hello "); string str2("world!\n");str1 += str2; str1 += "nice job\n"; str1 += 'a';
4.2 使用 string.append() 函數(shù)
可以使用 string.append() 函數(shù)來(lái)在一個(gè) string 對(duì)象后面附加一個(gè) string 對(duì)象或 C 風(fēng)格的字符串:
string str1 = "hello,world!"; string str2 = "HELLO,WORLD!";str1.append(str2);
str1.append(“C string”);
?
4.3 使用 string.push_back() 函數(shù)
可以使用 string.push_back() 函數(shù)來(lái)在一個(gè) string 對(duì)象后面附加一個(gè)字符:
string str("Hello"); str.push_back('a');?
五、string 對(duì)象的比較
在 C 語(yǔ)言中,使用 strcmp、strncmp 函數(shù)來(lái)進(jìn)行字符串的比較。在 C++ 中,由于將 string 對(duì)象聲明為了簡(jiǎn)單變量,故而對(duì)字符串的比較操作十分簡(jiǎn)單了,直接使用關(guān)系運(yùn)算符(==、!=、<、<=、>、>=)即可:
#include <string> #include <iostream>using namespace std;
int main()
{
string str1(“hello”);
string str2(“hello”);
}
當(dāng)然,也可以使用類似 strcmp 的函數(shù)來(lái)進(jìn)行 string 對(duì)象的比較,string 類提供的是 string.compare() 方法,函數(shù)原型如下:
int compare(const string&str) const;int compare(size_t pos,size_t len,const string&str)const; // 參數(shù) pos 為比較字符串中第一個(gè)字符的位置,len 為比較字符串的長(zhǎng)度
int compare(size_t pos,size_t len,const string&str, size_t subpos,size_t sublen)const;
int compare(const char * s)const;
int compare(size_t pos,size_t len,const char * s)const;
int compare(size_t pos,size_t len,const char * s,size_t n)const;
? compare 方法的返回值如下:
1)返回 0,表示相等;
2)返回結(jié)果小于 0,表示比較字符串中第一個(gè)不匹配的字符比源字符串小,或者所有字符都匹配但是比較字符串比源字符串短;
3)返回結(jié)果大于 0,表示比較字符串中第一個(gè)不匹配的字符比源字符串大,或者所有字符都匹配但是比較字符串比源字符串長(zhǎng)。
?
六、使用 string.substr() 函數(shù)來(lái)獲取子串
可以使用 string.substr() 函數(shù)來(lái)獲取子串,string.substr() 函數(shù)的定義如下:
string substr(size_t pos = 0,size_t len = npos)const;其中,pos 是子字符串的起始位置(索引,第一個(gè)字符的索引為 0),len 是子串的長(zhǎng)度。這個(gè)函數(shù)的功能是:復(fù)制一個(gè) string 對(duì)象中從 pos 處開(kāi)始的 len 個(gè)字符到 string 對(duì)象 substr 中去,并返回 substr。
string str("Hello,World!"); string subStr = str.substr(3,5); cout << subStr << endl;這段代碼的輸出結(jié)果為:"lo,Wo"。
?
七、訪問(wèn) string 字符串的元素?
可以像 C 語(yǔ)言中一樣,將 string 對(duì)象當(dāng)做一個(gè)數(shù)組,然后使用數(shù)組下標(biāo)的方式來(lái)訪問(wèn)字符串中的元素;也可以使用 string.at(index) 的方式來(lái)訪問(wèn)元素(索引號(hào)從 0 開(kāi)始):
string str("Hello,World!"); cout << str[1] << endl; // 使用數(shù)組下標(biāo)的方式訪問(wèn) string 字符串的元素 cout << str.at(1) << endl; // 使用 at 索引訪問(wèn) string 字符串的元素?
八、string 對(duì)象的查找操作
8.1 使用 string.find() 方法查找字符
find 方法的函數(shù)原型如下:
1)從字符串的 pos 位置開(kāi)始(若不指定 pos 的值,則默認(rèn)從索引 0 處開(kāi)始),查找子字符串 str。如果找到,則返回該子字符串首次出現(xiàn)時(shí)其首字符的索引;否則,返回 string::npos:
size_type find (const string& str, size_type pos = 0) const;2)從字符串的 pos 位置開(kāi)始(若不指定 pos 的值,則默認(rèn)從索引 0 處開(kāi)始),查找子字符串 s。如果找到,則返回該子字符串首次出現(xiàn)時(shí)其首字符的索引;否則,返回 string::npos:
size_type find (const char *s, size_type pos = 0) const;?3)從字符串的 pos 位置開(kāi)始(若不指定 pos 的值,則默認(rèn)從索引 0 處開(kāi)始),查找 s 的前 n 個(gè)字符組成的子字符串。如果找到,則返回該子字符串首次出現(xiàn)時(shí)其首字符的索引;否則,返回 string::npos:
size_type find (const char *s, size_type pos, size_type n);?4)從字符串的 pos 位置開(kāi)始(若不指定 pos 的值,則默認(rèn)從索引 0 處開(kāi)始),查找字符 ch 。如果找到,則返回該字符首次出現(xiàn)的位置;否則,返回 string::npos:
size_type find (char ch, size_type pos = 0) const;? 舉個(gè)查找子字符串的例子(查找字符的代碼與這一樣,只需要將 find 函數(shù)的參數(shù)換成字符即可):
#include <string> #include <iostream>using namespace std;
int main()
{
string str(“cat,dog,cat,pig,little cat,hotdog,little pig,angry dog”);
size_t catPos = str.find(“cat”,0);
}
程序輸出結(jié)果如下:
8.2 string.rfind()
string.rfind() 與 string.find() 方法類似,只是查找順序不一樣, string.rfind() 是從指定位置 pos (默認(rèn)為字符串末尾)開(kāi)始向前查找,直到字符串的首部,并返回第一次查找到匹配項(xiàng)時(shí)匹配項(xiàng)首字符的索引。換句話說(shuō),就是查找子字符串或字符最后一次出現(xiàn)的位置。還是以上面的程序?yàn)槔?#xff0c;稍作修改:
#include <string> #include <iostream>using namespace std;
int main()
{
string str(“cat,dog,cat,pig,little cat,hotdog,little pig,angry dog”);
size_t catPos = str.rfind(“cat”,str.length()-1);
}
程序輸出結(jié)果如下:
可以看到,rfind 方法是從字符串末開(kāi)始查找的。
?
8.3 string.find_first_of()
? string.find_first_of() 方法在字符串中從指定位置開(kāi)始向后(默認(rèn)為索引 0 處)查找參數(shù)中任何一個(gè)字符首次出現(xiàn)的位置。舉個(gè)例子說(shuō)明:
#include <string> #include <iostream>using namespace std;
int main()
{
string str(“cat,dog,cat,pig,little cat,hotdog,little pig,angry dog”);
size_t pos = str.find_first_of(“zywfgat”);
}
? 程序輸出結(jié)果是:在索引 1 處匹配到。所查找的字符串 zywfgat 中,第一次出現(xiàn)在字符串 str 中的字符是 'a',該字符在 str 中的索引是 1.
8.4 string.find_last_of()
? string.find_last_of() 方法在字符串中查找參數(shù)中任何一個(gè)字符最后一次出現(xiàn)的位置(也就是從指定位置開(kāi)始往前查找,第一個(gè)出現(xiàn)的位置)。
8.5 string.find_first_not_of()
string.find_first_not_of() 方法在字符串中查找第一個(gè)不包含在參數(shù)中的字符。
8.6 string.find_last_not_of()
string.find_last_not_of() 方法在字符串中查找最后一個(gè)不包含在參數(shù)中的字符(從指定位置開(kāi)始往前查找,第一個(gè)不包含在參數(shù)中的字符)。
?
九、string 對(duì)象的插入和刪除操作
9.1 使用 string.insert() 進(jìn)行插入操作
? 函數(shù)原型如下:
string&insert(size_t pos,const string&str); // 在位置 pos 處插入字符串 strstring&insert(size_t pos,const string&str,size_t subpos,size_t sublen); // 在位置 pos 處插入字符串 str 的從位置 subpos 處開(kāi)始的 sublen 個(gè)字符
string&insert(size_t pos,const char * s); // 在位置 pos 處插入字符串 s
string&insert(size_t pos,const char * s,size_t n); // 在位置 pos 處插入字符串 s 的前 n 個(gè)字符
string&insert(size_t pos,size_t n,char c); // 在位置 pos 處插入 n 個(gè)字符 c
iterator insert (const_iterator p, size_t n, char c); // 在 p 處插入 n 個(gè)字符 c,并返回插入后迭代器的位置
iterator insert (const_iterator p, char c); // 在 p 處插入字符 c,并返回插入后迭代器的位置
? 舉個(gè)例子:
#include <string> #include <iostream>using namespace std;
int main()
{
string str(“abcdefgh”);
str.insert(1,“INSERT”); // 在位置 1 處插入字符串 “INSERT”
cout << str << endl;
}
輸出結(jié)果如下:
?
9.2 使用 string.erase() 進(jìn)行元素刪除操作
函數(shù)原型如下:
string& erase (size_t pos = 0, size_t len = npos); // 刪除從 pos 處開(kāi)始的 n 個(gè)字符iterator erase (const_iterator p); // 刪除 p 處的一個(gè)字符,并返回刪除后迭代器的位置
iterator erase (const_iterator first, const_iterator last); // 刪除從 first 到 last 之間的字符,并返回刪除后迭代器的位置
? 舉個(gè)例子:
#include <string> #include <iostream>using namespace std;
int main()
{
string str(“Hello,World!”);
str.erase(5,6); // 刪除從索引位置 5 開(kāi)始的 6 個(gè)字符
cout << “str 為:” << str << endl;
}
? 關(guān)于 erase() 函數(shù)的用法可以參考?https://www.cnblogs.com/liyazhou/archive/2010/02/07/1665421.html
?
十、string 對(duì)象的一些其他操作
10.1 使用 getline() 函數(shù)來(lái)獲取 string 輸入
string str;getline(cin,str); // 從輸入流中讀取一行數(shù)據(jù)到 str
?
10.2 使用 empty() 函數(shù)判斷字符串是否為空
string str;if(str.empty()){
cout << “字符串為空” << endl;
}
string.empty() 函數(shù),若字符串為空,則返回真,否則返回假。
?
10.3 使用 swap 函數(shù)交換兩個(gè)字符串
#include <string> #include <iostream>using namespace std;
int main()
{
string str1 = “hello,world!”;
string str2 = “HELLO,WORLD!”;
}
?
?
?
參考資料:
C++ Primer Plus(第六版)
標(biāo)簽: C++ <div id="blog_post_info"> 好文要頂 關(guān)注我 收藏該文 tongye關(guān)注 - 22
粉絲 - 26 +加關(guān)注 0 0 <div class="clear"></div> <div id="post_next_prev"><a href="https://www.cnblogs.com/tongye/p/9713259.html" class="p_n_p_prefix">? </a> 上一篇: <a href="https://www.cnblogs.com/tongye/p/9713259.html" title="發(fā)布于 2019-04-23 00:31">基本數(shù)據(jù)結(jié)構(gòu) -- 鏈表的遍歷、查找、插入和刪除</a> <br> <a href="https://www.cnblogs.com/tongye/p/10665771.html" class="p_n_p_prefix">? </a> 下一篇: <a href="https://www.cnblogs.com/tongye/p/10665771.html" title="發(fā)布于 2019-04-27 00:55">Shell 基礎(chǔ) -- 流編輯器 sed 詳解</a> posted @ 2019-04-24 15:17? tongye? 閱讀(4370)? 評(píng)論(0)? 編輯? 收藏
總結(jié)
以上是生活随笔為你收集整理的转载:c+string类详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 转载:cin总结附带string输入总结
- 下一篇: 转载:c输入空格字符串