亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++中string的用法和例子

2020-05-23 13:30:41
字體:
來源:轉載
供稿:網友

string是C++標準庫的一個重要的部分,主要用于字符串處理??梢允褂幂斎胼敵隽鞣绞街苯舆M行操作,也可以通過文件等手段進行操作。同時C++的算法庫對string也有著很好的支持,而且string還和c語言的字符串之間有著良好的接口。雖然也有一些弊端,但是瑕不掩瑜。

其中使用的代碼多數都是來自cpp官網,因為例子非常全。

聲明和初始化方法:

想使用string首先要在頭文件當中加入< string >
聲明方式也很簡單

聲明:

string s;//聲明一個string 對象string ss[10];//聲明一個string對象的數組

初始化:

使用等號的初始化叫做拷貝初始化,不使用等號的初始化叫做直接初始化。

#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); string s;//默認初始化,一個空字符串 string s1("ssss");//s1是字面值“ssss”的副本 string s2(s1);//s2是s1的副本 string s3=s2;//s3是s2的副本 string s4(10,'c');//把s4初始化 string s5="hiya";//拷貝初始化 string s6=string(10,'c');//拷貝初始化,生成一個初始化好的對象,拷貝給s6 //string s(cp,n) char cs[]="12345"; string s7(cs,3);//復制字符串cs的前3個字符到s當中 //string s(s2,pos2) string s8="asac"; string s9(s8,2);//從s2的第二個字符開始拷貝,不能超過s2的size //string s(s2,pos2,len2) string s10="qweqweqweq"; string s11(s10,3,4);//s4是s3從下標3開始4個字符的拷貝,超過s3.size出現未定義 return 0;}

字符串處理:

substr操作:

注意substr沒有迭代器作為參數的操作

#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); string s="abcdefg"; //s.substr(pos1,n)返回字符串位置為pos1后面的n個字符組成的串 string s2=s.substr(1,5);//bcdef //s.substr(pos)//得到一個pos到結尾的串 string s3=s.substr(4);//efg return 0;}

如果輸入的位置超過字符的長度,會拋出一個out_of_range的異常

insert操作:

代碼來自cpp官網,經過自己的整理

注意用迭代器當參數和無符號數當參數的區別

#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); string str="to be question"; string str2="the "; string str3="or not to be"; string::iterator it; //s.insert(pos,str)//在s的pos位置插入str str.insert(6,str2);     // to be the question //s.insert(pos,str,a,n)在s的pos位置插入str中插入位置a到后面的n個字符 str.insert(6,str3,3,4);    // to be not the question //s.insert(pos,cstr,n)//在pos位置插入cstr字符串從開始到后面的n個字符 str.insert(10,"that is cool",8); // to be not that is the question //s.insert(pos,cstr)在s的pos位置插入cstr str.insert(10,"to be ");   // to be not to be that is the question //s.insert(pos,n,ch)在s.pos位置上面插入n個ch str.insert(15,1,':');    // to be not to be: that is the question //s.insert(s.it,ch)在s的it指向位置前面插入一個字符ch,返回新插入的位置的迭代器 it = str.insert(str.begin()+5,','); // to be, not to be: that is the question //s.insert(s.it,n,ch)//在s的it所指向位置的前面插入n個ch str.insert (str.end(),3,'.');  // to be, not to be: that is the question... //s.insert(it,str.ita,str.itb)在it所指向的位置的前面插入[ita,itb)的字符串 str.insert (it+2,str3.begin(),str3.begin()+3); // to be, or not to be: that is the question... return 0;}

erase操作:

用來執行刪除操作

刪除操作有三種

  • 指定pos和len,其中pos為為起始位置,pos以及后面len-1個字符串都刪除
  • 迭代器,刪除迭代器指向的字符
  • 迭代器范圍,刪除這一范圍的字符串,范圍左閉右開
  •  

代碼來自cpp官網

#include <iostream>#include <string>int main (){ std::string str ("This is an example sentence."); std::cout << str << '/n';       // "This is an example sentence." str.erase (10,8);  //   ^^^^^^^^ //直接指定刪除的字符串位置第十個后面的8個字符 std::cout << str << '/n';       // "This is an sentence." str.erase (str.begin()+9);//   ^ //刪除迭代器指向的字符 std::cout << str << '/n';       // "This is a sentence."       //  ^^^^^ str.erase (str.begin()+5, str.end()-9); //刪除迭代器范圍的字符 std::cout << str << '/n';       // "This sentence." return 0;}

append和replace操作:

append函數可以用來在字符串的末尾追加字符和字符串。由于string重載了運算符,也可以用+=操作實現
repalce顧名思義,就是替換的意思,先刪除,后增加。

代碼來自cpp官網,附上自己的解釋

#include <iostream>#include <string>int main (){ std::string str; std::string str2="Writing "; std::string str3="print 10 and then 5 more"; //直接追加一個str2的字符串 str.append(str2);      // "Writing " //后面追加str3第6個字符開始的3個字符串 str.append(str3,6,3);     // "10 " //追加字符串形參的前5個字符 str.append("dots are cool",5);   // "dots " //直接添加 str.append("here: ");     // "here: " //添加10個'.' str.append(10u,'.');     // ".........." //添加str3迭代器范圍的字符串 str.append(str3.begin()+8,str3.end()); // " and then 5 more" //最后這個比較特殊,意思是添加5個'A',實際上參數里面的65對應的asc碼就是65 str.append<int>(5,65);    // "....." //字符串追加也可以用重載運算符實現 str+="lalala"; std::cout << str << '/n'; return 0;}

replace的使用方法,replace支持使用無符號整數尋找位置,也支持用迭代器尋找位置

#include <iostream>#include <string>int main (){ std::string base="this is a test string."; std::string str2="n example"; std::string str3="sample phrase"; std::string str4="useful."; // replace signatures used in the same order as described above: // Using positions:     0123456789*123456789*12345 std::string str=base;   // "this is a test string." //第9個字符以及后面的4個字符被str2代替 str.replace(9,5,str2);   // "this is an example string." (1) //第19個字符串以及后面的5個字符用str的第7個字符以及后面的5個字符代替 str.replace(19,6,str3,7,6);  // "this is an example phrase." (2) //第8個字符以及后面的9個字符用字符串參數代替 str.replace(8,10,"just a");  // "this is just a phrase."  (3) //第8個字符以及后面的5個字符用字符串參數的前7個字符替換 str.replace(8,6,"a shorty",7); // "this is a short phrase." (4) //第22以及后面的0個字符用3個嘆號替換 str.replace(22,1,3,'!');  // "this is a short phrase!!!" (5) //迭代器的原理同上 // Using iterators:            0123456789*123456789* str.replace(str.begin(),str.end()-3,str3);     // "sample phrase!!!"  (1) str.replace(str.begin(),str.begin()+6,"replace");    // "replace phrase!!!"  (3) str.replace(str.begin()+8,str.begin()+14,"is coolness",7); // "replace is cool!!!" (4) str.replace(str.begin()+12,str.end()-4,4,'o');    // "replace is cooool!!!" (5) str.replace(str.begin()+11,str.end(),str4.begin(),str4.end());// "replace is useful." (6) std::cout << str << '/n';  return 0;}

以上的replace操作可以用insert和erase的操作組合替換,但是replace操作更加方便。

assign操作:

assign操作在一起列容器當中都存在,比如vector等等。是一個很基本的操作函數,string使用assign可以靈活的對其進行賦值。

代碼來自cpp官網

#include <iostream>#include <string>int main (){ std::string str; std::string base="The quick brown fox jumps over a lazy dog."; // used in the same order as described above: //直接把base賦值給str str.assign(base); std::cout << str << '/n'; //把base第10個字符以及后面的8個字符賦給str str.assign(base,10,9); std::cout << str << '/n';   // "brown fox" //把參數中的0到6個字符串賦給str str.assign("pangrams are cool",7); std::cout << str << '/n';   // "pangram" //直接使用參數賦值 str.assign("c-string"); std::cout << str << '/n';   // "c-string" //給str賦值10個'*'字符 str.assign(10,'*'); std::cout << str << '/n';   // "**********" //賦值是10個'-' str.assign<int>(10,0x2D); std::cout << str << '/n';   // "----------" //指定base迭代器范圍的字符串 str.assign(base.begin()+16,base.end()-12); std::cout << str << '/n';   // "fox jumps over" return 0;}

string的搜索操作:

string類中提供了很多性能優秀,使用方便的成員方法。而且在泛型算法當中也有很多實用的技巧。

find和rfind函數:

find函數主要是查找一個字符串是否在調用的字符串中出現過,大小寫敏感。

代碼來自cpp官網

#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); std::string str ("There are two needles in this haystack with needles."); std::string str2 ("needle"); // different member versions of find in the same order as above: //在str當中查找第一個出現的needle,找到則返回出現的位置,否則返回結尾 std::size_t found = str.find(str2); if (found!=std::string::npos) std::cout << "first 'needle' found at: " << found << '/n'; //在str當中,從第found+1的位置開始查找參數字符串的前6個字符 found=str.find("needles are small",found+1,6); if (found!=std::string::npos) std::cout << "second 'needle' found at: " << found << '/n'; //在str當中查找參數中的字符串 found=str.find("haystack"); if (found!=std::string::npos) std::cout << "'haystack' also found at: " << found << '/n'; //查找一個字符 found=str.find('.'); if (found!=std::string::npos) std::cout << "Period found at: " << found << '/n'; //組合使用,把str2用參數表中的字符串代替 // let's replace the first needle: str.replace(str.find(str2),str2.length(),"preposition"); std::cout << str << '/n'; return 0;}

rfind函數就是找最后一個出現的匹配字符串,返回的位置仍然是從前往后數的。

#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); std::string str ("The sixth sick sheik's sixth sheep's sick."); std::string key ("sixth");//     ^ //rfind是找最后一個出現的匹配字符串 std::size_t found = str.rfind(key); if (found!=std::string::npos) {  cout<<found<<endl;//輸出23  str.replace (found,key.length(),"seventh");//找到的sixth替換成seventh } std::cout << str << '/n'; return 0;}

查找的效率非常高,我沒看過stl源碼剖析,但是感覺是用kmp實現的。呵呵,可以自己寫一個。

find_….of函數:

find_first_of(args) 查找args中任何一個字符第一次出現的位置find_last_of(args) 最后一個出現的位置find_fist_not_of(args) 查找第一個不在args中的字符find_last_not_of 查找最后一個不在args中出現的字符#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); std::string str1 ("Please, replace the vowels in this sentence by asterisks."); std::size_t found1 = str1.find_first_of("aeiou"); //把所有元音找出來用*代替 while (found1!=std::string::npos) {  str1[found1]='*';  found1=str1.find_first_of("aeiou",found1+1); } std::cout << str1 << '/n'; //在str2中找到第一個不是消協英文字母和空格的字符 std::string str2 ("look for non-alphabetic characters..."); std::size_t found2 = str2.find_first_not_of("abcdefghijklmnopqrstuvwxyz "); if (found2!=std::string::npos) {  std::cout << "The first non-alphabetic character is " << str2[found2];  std::cout << " at position " << found2 << '/n'; } return 0;}

find_last_of和find_last_not_of與first基本相同,就不寫例子代碼了。

比較與轉換:

類似c語言的字符串比較函數strcmp函數一樣,支持字符串比較操作,同時也類似python、C#語言中的函數一樣,支持把數字和字符串轉換。有些特性是C++11當中才有。

注意編譯器bug:

在MinGW編譯器當中如果版本低于3.8,雖然支持c++11但是里面有一個bug,就是不支持字符串和數組的轉換!要更新MinGW的版本才可以,或者直接使用g++。

compare函數:

和strcmp函數一樣,如果兩個字符串相等,那么返回0,調用對象大于參數返回1,小于返回-1。

在compare當中還支持部分比較,里面有6個參數可以設置。

#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); string s1="123",s2="123"; cout<<s1.compare(s2)<<endl;//0 s1="123",s2="1234"; cout<<s1.compare(s2)<<endl;//-1 s1="1234",s2="123"; cout<<s1.compare(s2)<<endl;//1 std::string str1 ("green apple"); std::string str2 ("red apple"); if (str1.compare(str2) != 0) std::cout << str1 << " is not " << str2 << '/n'; //str1的第6個字符以及后面的4個字符和參數比較 if (str1.compare(6,5,"apple") == 0) std::cout << "still, " << str1 << " is an apple/n"; if (str2.compare(str2.size()-5,5,"apple") == 0) std::cout << "and " << str2 << " is also an apple/n"; //str1的第6個字符以及后面的4個字符和str2的第4個字符以及后面的4個字符比較 if (str1.compare(6,5,str2,4,5) == 0) std::cout << "therefore, both are apples/n"; return 0;}

由于string重載了運算符,可以直接用>,<,==來進行比較,也很方便。

數值轉換:

在io的部分有過數值和字符串相互轉換的例子,使用的是stringstream函數,在c++11當中有定義好的現成的函數取調用,非常方便。

 

string和數值轉換  
to_string(val) 把val轉換成string
stoi(s,p,b) 把字符串s從p開始轉換成b進制的int
stol(s,p,b) long
stoul(s,p,b) unsigned long
stoll(s,p,b) long long
stoull(s,p,b) unsigned long long
stof(s,p) float
stod(s,p) double
stold(s,p) long double

 

//注意,下段代碼在MinGw中會報錯!即使使用c++11編譯也一樣,無法識別to_string!#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); string s1; s1=to_string(100); cout<<s1<<endl; int a=stoi(s1,0,10)+1; cout<<a<<endl; return 0;}

總結

以上所述是小編給大家介紹的C++中string的用法和例子,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频久久网| 大伊人狠狠躁夜夜躁av一区| 国产视频亚洲精品| 国产亚洲精品一区二区| 在线观看久久久久久| 亚洲天堂成人在线| 精品一区二区三区四区在线| 精品国产91久久久久久| 欧美亚洲国产视频小说| 日韩成人免费视频| 国产99久久精品一区二区永久免费| 亚洲国产精品电影在线观看| 成人激情在线播放| 国产精品久久久久久av福利软件| 91九色精品视频| 欧美视频中文在线看| 91精品国产91久久久久福利| 亚洲最大在线视频| 国产精品亚发布| 中文字幕久热精品在线视频| 美女福利视频一区| 国产91精品久久久久| 色爱精品视频一区| 国产日韩精品视频| 国产精品成人免费视频| 色综合久久悠悠| 色爱精品视频一区| 欧美亚洲国产精品| 国产成+人+综合+亚洲欧美丁香花| 狠狠色香婷婷久久亚洲精品| 欧美性xxxx极品高清hd直播| 国产精品亚洲片夜色在线| 中文字幕国内精品| 日韩av片免费在线观看| 日韩精品一二三四区| 久久亚洲精品中文字幕冲田杏梨| 久久不射电影网| 久久久视频在线| 日韩电影在线观看永久视频免费网站| 国产精品一区二区久久久| 日韩中文字幕在线精品| 亚洲美腿欧美激情另类| 国模吧一区二区三区| 成人黄色激情网| 国内精品400部情侣激情| 亚洲a成v人在线观看| 欧美老女人性视频| 精品国产91乱高清在线观看| 亚洲成人久久久久| 一区二区三区四区视频| 日本高清不卡在线| 国产精品户外野外| 亚洲精品一区二区久| 欧美与欧洲交xxxx免费观看| 久久99视频精品| 亚洲伊人久久综合| 国内精品模特av私拍在线观看| 国产精品嫩草影院一区二区| 日韩成人中文电影| 久久成人国产精品| 亚洲精品视频免费| 最近2019中文字幕在线高清| 欧美成人久久久| 国产欧洲精品视频| 黄网站色欧美视频| 国产精品视频永久免费播放| 日韩av一区二区在线| 欧美制服第一页| 欧美一级电影久久| 视频在线观看一区二区| 国产在线98福利播放视频| 日韩天堂在线视频| 久久久久久噜噜噜久久久精品| 隔壁老王国产在线精品| 亚洲一区免费网站| 91九色蝌蚪国产| 国产精国产精品| 成人激情av在线| 国产亚洲欧洲黄色| 欧美精品久久久久久久| 国产在线观看精品一区二区三区| 国产精品久久久久久久9999| 中文字幕av一区二区| 美女福利视频一区| 91香蕉电影院| 国产欧美一区二区三区视频| 91网在线免费观看| 55夜色66夜色国产精品视频| 久久影视三级福利片| 日韩在线视频导航| 北条麻妃一区二区在线观看| 日韩av在线网| 538国产精品一区二区免费视频| 在线观看国产精品淫| 国产一区二中文字幕在线看| 992tv成人免费视频| 91精品国产沙发| 国产日本欧美一区| 日韩动漫免费观看电视剧高清| 国产mv久久久| 青青草原一区二区| 亚洲第一精品自拍| 国产伊人精品在线| 精品日本高清在线播放| 欧美理论电影网| 91精品国产综合久久香蕉| 在线观看国产精品淫| 亚洲欧洲第一视频| 国产成人在线亚洲欧美| 日韩精品高清视频| 91精品久久久久久久久不口人| 欧美午夜www高清视频| 97香蕉久久夜色精品国产| 国产精品亚洲欧美导航| 国产精品高潮呻吟视频| 亚洲第一中文字幕在线观看| 久久97久久97精品免视看| 欧美激情视频在线免费观看 欧美视频免费一| 欧美精品在线视频观看| 美女福利视频一区| 欧美激情影音先锋| 亚洲性视频网站| 在线观看久久久久久| 中国china体内裑精亚洲片| 亚洲最大福利视频网| 久久视频免费在线播放| 青草青草久热精品视频在线观看| 国产免费一区视频观看免费| 久久久极品av| 91精品国产高清自在线| 夜夜嗨av一区二区三区免费区| 色噜噜久久综合伊人一本| 一区二区三区 在线观看视| 亚洲国产精品va| 久久久国产精彩视频美女艺术照福利| 久久久999国产| 亚洲香蕉成人av网站在线观看| 奇米4444一区二区三区| 精品国产欧美成人夜夜嗨| 黑人狂躁日本妞一区二区三区| 亚洲天堂免费视频| 欧美午夜激情在线| 97精品免费视频| 热久久免费国产视频| 欧美午夜精品久久久久久人妖| 国产欧美精品一区二区三区-老狼| 国产精品久久久久久久久久东京| 国产精品pans私拍| 欧美在线激情视频| 色琪琪综合男人的天堂aⅴ视频| 精品欧美国产一区二区三区| 欧美激情视频播放| 日韩在线激情视频| 乱亲女秽乱长久久久| 亚洲va男人天堂| 中文字幕亚洲综合久久筱田步美| 欧美国产在线视频| 久久精品欧美视频| 久久九九热免费视频| 欧美丰满少妇xxxxx做受| 中文字幕不卡在线视频极品| 日韩欧美在线网址| 久久精品2019中文字幕| 亚洲自拍欧美色图|