程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c++中的string經常使用函數用法總結

c++中的string經常使用函數用法總結

編輯:關於C++

c++中的string經常使用函數用法總結。本站提示廣大學習愛好者:(c++中的string經常使用函數用法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是c++中的string經常使用函數用法總結正文


尺度c++中string類函數引見

留意不是CString
之所以擯棄char*的字符串而選用C++尺度法式庫中的string類,是由於他和前者比擬起來,不用 擔憂內存能否足夠、字符串長度等等,並且作為一個類湧現,他集成的操作函數足以完成我們年夜多半情形下(乃至是100%)的須要。我們可以用 = 停止賦值操作,== 停止比擬,+ 做串連(是否是很簡略?)。我們盡可以把它算作是C++的根本數據類型。

好了,進入正題………
起首,為了在我們的法式中應用string類型,我們必需包括頭文件 <string>。

以下:
#include <string> //留意這裡不是string.h string.h是C字符串頭文件
#include <string>
using namespace std;

1.聲明一個C++字符串
聲明一個字符串變量很簡略:
string Str;
如許我們就聲清楚明了一個字符串變量,但既然是一個類,就有結構函數和析構函數。下面的聲明沒有傳入參數,所以就直接應用了string的默許的結構函數,這個函數所作的就是把Str初始化為一個空字符串。String類的結構函數和析構函數以下:
a)      string s;    //生成一個空字符串s
b)      string s(str) //拷貝結構函數 生成str的復成品
c)      string s(str,stridx) //將字符串str內“始於地位stridx”的部門看成字符串的初值
d)      string s(str,stridx,strlen) //將字符串str內“始於stridx且長度頂多strlen”的部門作為字符串的初值
e)      string s(cstr) //將C字符串作為s的初值
f)      string s(chars,chars_len) //將C字符串前chars_len個字符作為字符串s的初值。
g)      string s(num,c) //生成一個字符串,包括num個c字符
h)      string s(beg,end) //以區間beg;end(不包括end)內的字符作為字符串s的初值
i)      s.~string() //燒毀一切字符,釋放內存
都很簡略,我就不說明了。

2.字符串操作函數
這裡是C++字符串的重點,我先把各類操作函數枚舉出來,不愛好把一切函數都看完的人可以在這裡找本身愛好的函數,再到前面看他的具體說明。
a) =,assign()     //賦以新值
b) swap()     //交流兩個字符串的內容
c) +=,append(),push_back() //在尾部添加字符
d) insert() //拔出字符
e) erase() //刪除字符
f) clear() //刪除全體字符
g) replace() //調換字符
h) + //串連字符串
i) ==,!=,<,<=,>,>=,compare()    //比擬字符串
j) size(),length()    //前往字符數目
k) max_size() //前往字符的能夠最年夜個數
l) empty()    //斷定字符串能否為空
m) capacity() //前往從新分派之前的字符容量
n) reserve() //保存必定量內存以包容必定數目的字符
o) [ ], at() //存取單一字符
p) >>,getline() //從stream讀取某值
q) <<    //將謀值寫入stream
r) copy() //將某值賦值為一個C_string
s) c_str() //將內容以C_string前往
t) data() //將內容以字符數組情勢前往
u) substr() //前往某個子字符串
v)查找函數
w)begin() end() //供給相似STL的迭代器支撐
x) rbegin() rend() //逆向迭代器
y) get_allocator() //前往設置裝備擺設器

上面具體引見:

2.1 C++字符串和C字符串的轉換
C ++供給的由C++字符串獲得對應的C_string的辦法是應用data()、c_str()和copy(),個中,data()以字符數組的情勢前往字符串內容,但其實不添加'/0'。c_str()前往一個以‘/0'開頭的字符數組,而copy()則把字符串的內容復制或寫入既有的c_string或 字符數組內。C++字符串其實不以'/0'開頭。我的建議是在法式中能應用C++字符串就應用,除非萬不得已不選用c_string。因為只是簡略引見,具體引見擦過,誰想進一步懂得應用中的留意事項可以給我留言(到我的收件箱)。我具體說明。

2.2 年夜小和容量函數
一個C++字符串存在三種年夜小:a)現有的字符數,函數是size()和length(),他們等效。Empty()用來檢討字符串能否為空。b)max_size() 這個年夜小是指以後C++字符串最多能包括的字符數,極可能和機械自己的限制或許字符串地點地位持續內存的年夜小有關系。我們普通情形下不消關懷他,應當年夜小足夠我們用的。然則不敷用的話,會拋出length_error異常c)capacity()從新分派內存之前 string所能包括的最年夜字符數。這裡另外一個須要指出的是reserve()函數,這個函數為string從新分派內存。從新分派的年夜小由其參數決議, 默許參數為0,這時候候會對string停止非強迫性縮減。

還有需要再反復一下C++字符串和C字符串轉換的問 題,很多人會碰到如許的成績,本身做的法式要挪用他人的函數、類甚麼的(好比數據庫銜接函數Connect(char*,char*)),但他人的函數參 數用的是char*情勢的,而我們曉得,c_str()、data()前往的字符數組由該字符串具有,所所以一種const char*,要想作為下面說起的函數的參數,還必需拷貝到一個char*,而我們的准繩是能不應用C字符串就不應用。那末,這時候候我們的處置方法是:假如 此函數對參數(也就是char*)的內容不修正的話,我們可以如許Connect((char*)UserID.c_str(), (char*)PassWD.c_str()),然則這時候候是存在風險的,由於如許轉換後的字符串實際上是可以修正的(有興致地可以本身試一試),所以我強調除非函數挪用的時刻纰謬參數停止修正,不然必需拷貝到一個char*上去。固然,更穩妥的方法是不管甚麼情形都拷貝到一個char*上去。同時我們也禱告如今依然應用C字符串停止編程的高手們(說他們是高手一點兒也不為過,或許在我們還穿開裆褲的時刻他們就開端編程了,哈哈…)寫的函數都比擬標准,那樣我們就不用停止強迫轉換了。

2.3元素存取
我們可使用下標操作符[]和函數at()對元素包括的字符停止拜訪。然則應當留意的是操作符[]其實不檢討索引能否有用(有用索引0~str.length()),假如索引掉效,會惹起不決義的行動。而at()會檢討,假如應用 at()的時刻索引有效,會拋出out_of_range異常。

有一個破例不能不說,const string a;的操作符[]對索引值是a.length()依然有用,其前往值是'/0'。其他的各類情形,a.length()索引都是有效的。舉例以下:
const string Cstr(“const string”);
string Str(“string”);
Str[3];      //ok
Str.at(3);    //ok
Str[100]; //不決義的行動
Str.at(100);    //throw out_of_range
Str[Str.length()]    //不決義行動
Cstr[Cstr.length()] //前往 ‘/0'
Str.at(Str.length());//throw out_of_range
Cstr.at(Cstr.length()) ////throw out_of_range
我不贊同相似於上面的援用或指針賦值:
char& r=s[2];
char* p= &s[3];
由於一旦產生從新分派,r,p立刻掉效。防止的辦法就是不應用。

2.4比擬函數
C ++字符串支撐罕見的比擬操作符(>,>=,<,<=,==,!=),乃至支撐string與C-string的比擬(如 str<”hello”)。在應用>,>=,<,<=這些操作符的時刻是依據“以後字符特征”將字符按字典次序停止一一得 比擬。字典排序靠前的字符小,比擬的次序是早年向後比擬,碰到不相等的字符就按這個地位上的兩個字符的比擬成果肯定兩個字符串的年夜小。同時,string (“aaaa”) <string(aaaaa)。

另外一個功效壯大的比擬函數是成員函數compare()。他支撐多參數處置,支撐用索引值和長度定位子串來停止比擬。他前往一個整數來表現比擬成果,前往值意義以下:0-相等 〉0-年夜於 <0-小於。舉例以下:
string s(“abcd”);
s.compare(“abcd”); //前往0
s.compare(“dcba”); //前往一個小於0的值
s.compare(“ab”); //前往年夜於0的值
s.compare(s); //相等
s.compare(0,2,s,2,2); //用”ab”和”cd”停止比擬 小於零
s.compare(1,2,”bcx”,2); //用”bc”和”bc”比擬。
怎樣樣?功效夠全的吧!甚麼?還不克不及知足你的胃口?好吧,那等著,前面有更特性化的比擬算法。先給個提醒,應用的是STL的比擬算法。甚麼?對STL一無所知?靠,你重建吧!

2.5 更改內容
這在字符串的操作中占了很年夜一部門。
起首講賦值,第一個賦值辦法固然是應用操作符=,新值可所以string(如:s=ns) 、c_string(如:s=”gaint”)乃至單一字符(如:s='j')。還可使用成員函數assign(),這個成員函數可使你更靈巧的對字符串賦值。照樣舉例解釋吧:
s.assign(str); //不說
s.assign(str,1,3);//假如str是”iamangel” 就是把”ama”賦給字符串
s.assign(str,2,string::npos);//把字符串str從索引值2開端到開頭賦給s
s.assign(“gaint”); //不說
s.assign(“nico”,5);//把'n' ‘I' ‘c' ‘o' ‘/0'賦給字符串
s.assign(5,'x');//把五個x賦給字符串
把字符串清空的辦法有三個:s=””;s.clear();s.erase();(我愈來愈認為舉例比措辭讓他人輕易懂!)。
string供給了許多函數用於拔出(insert)、刪除(erase)、調換(replace)、增長字符。
先說增長字符(這裡說的增長是在尾巴上),函數有 +=、append()、push_back()。

舉例以下:
s+=str;//加個字符串
s+=”my name is jiayp”;//加個C字符串
s+='a';//加個字符
s.append(str);
s.append(str,1,3);//不說明了 同後面的函數參數assign的說明
s.append(str,2,string::npos)//不說明了
s.append(“my name is jiayp”);
s.append(“nico”,5);
s.append(5,'x');
s.push_back(‘a');//這個函數只能增長單個字符對STL熟習的懂得起來很簡略

或許你須要在string中央的某個地位拔出字符串,這時候候你可以用insert()函數,這個函數須要你指定一個安插地位的索引,被拔出的字符串將放在這個索引的前面。
      s.insert(0,”my name”);
      s.insert(1,str);
這類情勢的insert()函數不支撐傳入單個字符,這時候的單個字符必需寫成字符串情勢(讓人惡心)。既然你認為惡心,那就不能不持續讀上面一段話:為了插 入單個字符,insert()函數供給了兩個對拔出單個字符操作的重載函數:insert(size_type index,size_type num,chart c)和insert(iterator pos,size_type num,chart c)。個中size_type是無符號整數,iterator是char*,所以,你這麼挪用insert函數是不可的:insert(0,1, 'j');這時候候第一個參數將轉換成哪個呢?所以你必需這麼寫:insert((string::size_type)0,1,'j')!第二種情勢指 出了應用迭代器安插字符的情勢,在前面會說起。趁便提一下,string有許多操作是應用STL的迭代器的,他也盡可能做得和STL接近。

刪除函數erase()的情勢也有好幾種(真煩!),調換函數replace()也有好幾個。

舉例吧:
string s=”il8n”;
s.replace(1,2,”nternationalizatio”);//從索引1開端的2個調換成前面的C_string
s.erase(13);//從索引13開端往後全刪除
s.erase(7,5);//從索引7開端往後刪5個

2.6提取子串和字符串聯接
題取子串的函數是:substr(),情勢以下:
s.substr();//前往s的全體內容
s.substr(11);//從索引11往後的子串
s.substr(5,6);//從索引5開端6個字符
把兩個字符串聯合起來的函數是+。(誰不明確請致電120)

2.7輸出輸入操作
1.>> 從輸出流讀取一個string。
2.<< 把一個string寫入輸入流。
另外一個函數就是getline(),他從輸出流讀取一行內容,直到碰到分行符或到了文件尾。

2.8搜刮與查找
查找函數許多,功效也很壯大,包含了:
find()
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()

這些函數前往相符搜刮前提的字符區間內的第一個字符的索引,沒找到目的就前往npos。一切的函數的參數解釋以下:
第一個參數是被搜索的對象。第二個參數(無關緊要)指出string內的搜索終點索引,第三個參數(無關緊要)指出搜索的字符個數。比擬簡略,不多說不睬解的可以向我提出,我再細心的解答。固然,加倍壯大的STL搜索在前面會有說起。

最初再說說npos的寄義,string::npos的類型是string::size_type,所以,一旦須要把一個索引與npos比擬,這個索引值必需是string::size)type類型的,更多的情形下,我們可以直接把函數和npos停止比擬(如:if(s.find(“jia”)== string::npos))。

string類的結構函數:
string(const char *s);    //用c字符串s初始化
string(int n,char c);     //用n個字符c初始化
另外,string類還支撐默許結構函數和復制結構函數,如string s1;string s2="hello";都是准確的寫法。當結構的string太長而沒法表達時會拋出length_error異常

string類的字符操作:
const char &operator[](int n)const;
const char &at(int n)const;
char &operator[](int n);
char &at(int n);
operator[]和at()均前往以後字符串中第n個字符的地位,但at函數供給規模檢討,當越界時會拋出out_of_range異常,下標運算符[]不供給檢討拜訪。
const char *data()const;//前往一個非null終止的c字符數組
const char *c_str()const;//前往一個以null終止的c字符串
int copy(char *s, int n, int pos = 0) const;//把以後串中以pos開端的n個字符拷貝到以s為肇端地位的字符數組中,前往現實拷貝的數量

string的特征描寫:
int capacity()const;    //前往以後容量(即string中不用增長內存便可寄存的元素個數)
int max_size()const;    //前往string對象中可寄存的最年夜字符串的長度
int size()const;        //前往以後字符串的年夜小
int length()const;       //前往以後字符串的長度
bool empty()const;        //以後字符串能否為空
void resize(int len,char c);//把字符串以後年夜小置為len,並用字符c填充缺乏的部門

string類的輸出輸入操作:
string類重載運算符operator>>用於輸出,異樣重載運算符operator<<用於輸入操作。
函數getline(istream &in,string &s);用於從輸出流in中讀取字符串到s中,以換行符'\n'離開。

string的賦值:
string &operator=(const string &s);//把字符串s賦給以後字符串
string &assign(const char *s);//用c類型字符串s賦值
string &assign(const char *s,int n);//用c字符串s開端的n個字符賦值
string &assign(const string &s);//把字符串s賦給以後字符串
string &assign(int n,char c);//用n個字符c賦值給以後字符串
string &assign(const string &s,int start,int n);//把字符串s中從start開端的n個字符賦給以後字符串
string &assign(const_iterator first,const_itertor last);//把first和last迭代器之間的部門賦給字符串

string的銜接:
string &operator+=(const string &s);//把字符串s銜接到以後字符串的開頭
string &append(const char *s);            //把c類型字符串s銜接到以後字符串開頭
string &append(const char *s,int n);//把c類型字符串s的前n個字符銜接到以後字符串開頭
string &append(const string &s);    //同operator+=()
string &append(const string &s,int pos,int n);//把字符串s中從pos開端的n個字符銜接到以後字符串的開頭
string &append(int n,char c);        //在以後字符串開頭添加n個字符c
string &append(const_iterator first,const_iterator last);//把迭代器first和last之間的部門銜接到以後字符串的開頭

string的比擬:
bool operator==(const string &s1,const string &s2)const;//比擬兩個字符串能否相等
運算符">","<",">=","<=","!="均被重載用於字符串的比擬;
int compare(const string &s) const;//比擬以後字符串和s的年夜小
int compare(int pos, int n,const string &s)const;//比擬以後字符串從pos開端的n個字符構成的字符串與s的年夜小
int compare(int pos, int n,const string &s,int pos2,int n2)const;//比擬以後字符串從pos開端的n個字符構成的字符串與s中pos2開端的n2個字符構成的字符串的年夜小
int compare(const char *s) const;
int compare(int pos, int n,const char *s) const;
int compare(int pos, int n,const char *s, int pos2) const;
compare函數在>時前往1,<時前往-1,==時前往0  
string的子串:
string substr(int pos = 0,int n = npos) const;//前往pos開端的n個字符構成的字符串

string的交流:
void swap(string &s2);    //交流以後字符串與s2的值

string類的查找函數:
int find(char c, int pos = 0) const;//從pos開端查找字符c在以後字符串的地位
int find(const char *s, int pos = 0) const;//從pos開端查找字符串s在以後串中的地位
int find(const char *s, int pos, int n) const;//從pos開端查找字符串s中前n個字符在以後串中的地位
int find(const string &s, int pos = 0) const;//從pos開端查找字符串s在以後串中的地位
//查找勝利時前往地點地位,掉敗前往string::npos的值
int rfind(char c, int pos = npos) const;//從pos開端從後向前查找字符c在以後串中的地位
int rfind(const char *s, int pos = npos) const;
int rfind(const char *s, int pos, int n = npos) const;
int rfind(const string &s,int pos = npos) const;
//從pos開端從後向前查找字符串s中前n個字符構成的字符串在以後串中的地位,勝利前往地點地位,掉敗時前往string::npos的值
int find_first_of(char c, int pos = 0) const;//從pos開端查找字符c第一次湧現的地位
int find_first_of(const char *s, int pos = 0) const;
int find_first_of(const char *s, int pos, int n) const;
int find_first_of(const string &s,int pos = 0) const;
//從pos開端查找以後串中第一個在s的前n個字符構成的數組裡的字符的地位。查找掉敗前往string::npos
int find_first_not_of(char c, int pos = 0) const;
int find_first_not_of(const char *s, int pos = 0) const;
int find_first_not_of(const char *s, int pos,int n) const;
int find_first_not_of(const string &s,int pos = 0) const;
//從以後串中查找第一個不在串s中的字符湧現的地位,掉敗前往string::npos
int find_last_of(char c, int pos = npos) const;
int find_last_of(const char *s, int pos = npos) const;
int find_last_of(const char *s, int pos, int n = npos) const;
int find_last_of(const string &s,int pos = npos) const;
int find_last_not_of(char c, int pos = npos) const;
int find_last_not_of(const char *s, int pos = npos) const;
int find_last_not_of(const char *s, int pos, int n) const;
int find_last_not_of(const string &s,int pos = npos) const;
//find_last_of和find_last_not_of與find_first_of和find_first_not_of類似,只不外是從後向前查找

string類的調換函數:
string &replace(int p0, int n0,const char *s);//刪除從p0開端的n0個字符,然後在p0處拔出串s
string &replace(int p0, int n0,const char *s, int n);//刪除p0開端的n0個字符,然後在p0處拔出字符串s的前n個字符
string &replace(int p0, int n0,const string &s);//刪除從p0開端的n0個字符,然後在p0處拔出串s
string &replace(int p0, int n0,const string &s, int pos, int n);//刪除p0開端的n0個字符,然後在p0處拔出串s中從pos開端的n個字符
string &replace(int p0, int n0,int n, char c);//刪除p0開端的n0個字符,然後在p0處拔出n個字符c
string &replace(iterator first0, iterator last0,const char *s);//把[first0,last0)之間的部門調換為字符串s
string &replace(iterator first0, iterator last0,const char *s, int n);//把[first0,last0)之間的部門調換為s的前n個字符
string &replace(iterator first0, iterator last0,const string &s);//把[first0,last0)之間的部門調換為串s
string &replace(iterator first0, iterator last0,int n, char c);//把[first0,last0)之間的部門調換為n個字符c
string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之間的部門調換成[first,last)之間的字符串

string類的拔出函數:
string &insert(int p0, const char *s);
string &insert(int p0, const char *s, int n);
string &insert(int p0,const string &s);
string &insert(int p0,const string &s, int pos, int n);
//前4個函數在p0地位拔出字符串s中pos開端的前n個字符
string &insert(int p0, int n, char c);//此函數在p0處拔出n個字符c
iterator insert(iterator it, char c);//在it處拔出字符c,前往拔出後迭代器的地位
void insert(iterator it, const_iterator first, const_iterator last);//在it處拔出[first,last)之間的字符
void insert(iterator it, int n, char c);//在it處拔出n個字符c

string類的刪除函數
iterator erase(iterator first, iterator last);//刪除[first,last)之間的一切字符,前往刪除後迭代器的地位
iterator erase(iterator it);//刪除it指向的字符,前往刪除後迭代器的地位
string &erase(int pos = 0, int n = npos);//刪除pos開端的n個字符,前往修正後的字符串

string類的迭代器處置:
string類供給了向前和向後遍歷的迭代器iterator,迭代器供給了拜訪各個字符的語法,相似於指針操作,迭代器不檢討規模。

用string::iterator或string::const_iterator聲明迭代器變量,const_iterator不許可轉變迭代的內容。經常使用迭代器函數有:
const_iterator begin()const;
iterator begin();                //前往string的肇端地位
const_iterator end()const;
iterator end();                    //前往string的最初一個字符前面的地位
const_iterator rbegin()const;
iterator rbegin();                //前往string的最初一個字符的地位
const_iterator rend()const;
iterator rend();                    //前往string第一個字符地位的後面
rbegin和rend用於從後向前的迭代拜訪,經由過程設置迭代器string::reverse_iterator,string::const_reverse_iterator完成

字符串流處置:
經由過程界說ostringstream和istringstream變量完成,<sstream>頭文件中
例如:
string input("hello,this is a test");
istringstream is(input);
string s1,s2,s3,s4;
is>>s1>>s2>>s3>>s4;//s1="hello,this",s2="is",s3="a",s4="test"
ostringstream os;
os<<s1<<s2<<s3<<s4;
cout<<os.str();

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved