聲明字符串變量很簡單:
字符串Str
這樣,我們聲明了壹個字符串變量,但既然是類,就有構造函數和析構函數。上面的語句沒有傳入參數,所以直接使用string的默認構造函數。這個函數的作用是將str初始化為壹個空字符串。String類的構造函數和析構函數如下:
a)字符串s;//生成空字符串s
b)Strings(str)//Copy構造函數生成STR的副本。
c)Strings(str,stridx)//取字符串str中“起始於Stridx”的部分作為字符串的初始值。
d)Strings(str,STRDX,strlen)//取字符串STR中“以STRDX開頭,長度最多為STRLEN”的部分作為字符串的初始值。
E) string s(cstr) //取C字符串作為s的初始值。
F) string s(chars,chars_len) //取C字符串的前幾個chars_len字符作為字符串s的初始值。
G) strings s (num,c)//生成包含num c個字符的字符串。
h)字符串s (beg,end)//區間為beg;end中的字符(不包括end)作為字符串s的初始值。
I) s.~string() //銷毀所有字符並釋放內存。
都很簡單,就不解釋了。
2.字符串操作功能
這裏是C++字符串的焦點。我先列出各種操作函數。不喜歡看全部功能的可以在這裏找到自己喜歡的功能,後面再看他的詳細講解。
A) =,用新值賦值()//的。
B) swap() //交換兩個字符串的內容。
C) +=,append(),push_back() //在末尾添加字符。
D) insert() //插入字符
E) erase() //刪除字符
F) clear() //刪除所有字符。
G) replace() //替換字符
H)+//串聯字符串
我)==,!=,& lt,& lt=,& gt,& gt=,compare() //比較字符串
J) size(),length() //返回字符數。
K) max_size() //返回最大可能字符數。
L) empty() //確定字符串是否為空。
M) capacity() //返回重新分配前的字符容量。
N) reserve() //保留壹定數量的內存來容納壹定數量的字符。
O) [],at() //訪問單個字符
p)>& gt,getline() //從流中讀取壹個值。
q)& lt;& lt//將查找值寫入流中。
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)最大大小()
這個大小指的是當前C++字符串所能包含的最大字符數,大概和機器本身的限制或者字符串所在的連續內存大小有關。我們平時不用管他,對我們來說應該夠大了。但是如果還不夠,就會拋出length_error異常。c)在c)capacity()重新分配內存之前。
壹個字符串可以包含的最大字符數。這裏需要指出的另壹點是reserve()函數,它為string重新分配內存。重新分布的大小由其參數決定,
默認參數為0。這時候弦會不由自主的減。
還需要重復壹下C++字符串和C字符串轉換的問題。
問題,很多人都會遇到這樣的問題,自己的程序要調用別人的函數和類(比如數據庫連接函數Connect(char*,char*)),卻引用了別人的函數。
數字的形式是char*,我們知道c_str()和data()返回的字符數組歸字符串所有,所以是const。
Char*,如果要做上述函數的參數,也必須復制到壹個char*,我們的原則是不使用C字符串。所以,這個時候我們應該做的是:如果
如果這個函數不修改參數(也就是char*)的內容,我們可以這樣連接((char*)UserID.c_str()。
(char*)PassWD.c_str()),但這時候就危險了,因為轉換後的字符串實際上是可以修改的(有興趣的可以自己試試),所以我強調,除非調用函數時參數沒有修改,否則壹定要復制到壹個char*。當然,無論如何,把它復制到壹個char*是比較安全的。與此同時,我們祈禱
祈禱現在還在用C字符串編程的專家們(說他們是專家壹點都不誇張,可能他們在我們還穿著開襠褲的時候就開始編程了,哈哈……)寫出更標準化的函數,所以。
我們不需要演員陣容。
2.3元素訪問
我們可以使用下標操作符[]和函數at()來訪問元素中包含的字符。但需要註意的是,運算符[]並不檢查索引是否有效(有效索引0~str.length())。如果索引無效,將導致未定義的行為。並且at()將檢查,如果使用的話。
在()處,索引無效,將引發out_of_range異常。
有壹個例外,常量字符串。
a;的運算符[]對於a.length()的索引值仍然有效,其返回值為“\0”。在其他情況下,a.length()索引無效。例子如下:
const string Cstr(" const string ");
string Str(“字符串”);
str[3];//好的
str . at(3);//好的
str[100];//未定義的行為
str . at(100);//拋出_超出_範圍
Str[Str.length()] //未定義行為。
Cstr[Cstr.length()] //返回' \ 0 '
str . at(str . length());//拋出_超出_範圍
CSTR . at(CSTR . length())////拋出_超出_範圍
我不同意下面的引用或指針賦值:
char & ampr = s[2];
char * p = &s[3];
因為壹旦發生重分配,R和P會立即失效。避免它的方法是不使用它。
2.4比較功能
C ++字符串支持常見的比較運算符(>;,& gt=,& lt,& lt=,==,!=),甚至支持string和C-string的比較(比如
str & lt“妳好”).使用中>,>=,& lt,& lt=使用這些運算符時,字符按照“當前字符特征”逐壹排序。
比較壹下。字典頂部的字很小,比較的順序是從前到後。當遇到不相等的字符時,根據該位置兩個字符的比較結果確定兩個字符串的大小。與此同時,字符串
(“aaaa”)
另壹個強大的比較函數是成員函數compare()。支持多參數處理和帶索引值和長度定位子串的比較。他返回壹個整數來表示比較結果,返回值的含義如下:0-等於。
> 0-大於
字符串s(" ABCD ");
s . compare(" ABCD ");//返回0
美國比較(“dcba”);//返回壹個小於0的值。
s . compare(" ab ");//返回大於0的值
比較;//相等
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 .賦值(str);//不要說
s.assign(str,1,3);//如果str是“iamangel”,就是給字符串賦值“ama”。
s.assign(str,2,string::NPOs);//將字符串str從索引值2到末尾賦給S。
美國分配(“gaint”);//不要說
s.assign(“尼科”,5);//將“n'' i'' c'' o'' \ 0”賦給字符串。
s.assign(5,' x ');//給字符串賦值五個x。
有三種方法可以清空字符串:s =s . clear();s . erase();我越來越覺得舉例子比說話更容易讓別人理解!)。
String提供了許多插入、刪除、替換和添加字符的功能。
先說添加字符(這裏的添加是在尾部)。這些函數是+=、append()和push_back()。例子如下:
s+= str;//添加壹個字符串
s+=“我叫jiayp”;//添加壹個C字符串
s+= ' a ';//添加壹個字符
s.append(字符串);
s.append(str,1,3);//不解釋與前面的函數參數賦值相同的解釋。
S.append(str,2,string::npos)//無解釋。
s.append("我叫jiayp ");
s.append("尼科",5);
s.append(5,' x ');
s . push _ back(' a ');//這個函數只能增加單個字符對STL的熟悉程度,非常簡單易懂。
也許妳需要在字符串中間的某個地方插入壹個字符串。在這種情況下,您可以使用insert()函數,該函數要求您指定插入位置的索引,插入的字符串將放置在該索引之後。
s.insert(0,“我的名字”);
s.insert(1,str);
這種形式的insert()函數不支持傳入單個字符,所以單個字符必須寫成字符串(惡心)。既然覺得惡心,那就只好繼續看下面這段了:為了插入。
Insert()函數提供了兩個用於插入單個字符的重載函數:insert (size _ type index,size _ type num,chart。
c)和insert(叠代器位置,大小類型編號,圖表。
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,"國際化");//用下面的C_string替換從索引1開始的兩個。
s . erase(13);//從索引13中全部刪除。
s.erase(7,5);//從索引7中刪除5。
2.6提取子串和字符串連接
substring的函數是substr(),如下所示:
s . substr();//返回的全部內容。
s . substr(11);//索引11後的子字符串
s.substr(5,6);//從索引5開始的6個字符。
組合兩個字符串的函數是+。(不懂請撥打120)
2.7輸入和輸出操作
1.& gt& gt從輸入流中讀取字符串。
2.& lt& lt向輸出流中寫入壹個字符串。
另壹個函數是getline(),它從輸入流中讀取壹行,直到遇到換行符或到達文件末尾。
2.8搜索和查找
有許多功能強大的搜索功能,包括:
查找()
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()
這些函數返回字符範圍中滿足搜索條件的第壹個字符的索引,如果沒有找到目標,則返回npos。所有功能的參數描述如下:
第壹個參數是搜索的對象。第二個參數(可選)表示字符串中搜索起點的索引,第三個參數(可選)表示搜索的字符數。比較簡單。不太懂的可以問我,我會認真回答。當然後面還會提到更強大的STL搜索。
最後說壹下NPO的含義。string::npos的類型是string::size_type。因此,壹旦某個指標需要與NPO進行比較,該指標值必須是string::size)類型。更多的情況下,我們可以直接將函數與NPO進行比較(比如if (s.find ("jia") = = string:)。