c string函式精講

2021-07-13 07:02:01 字數 3141 閱讀 4072

還有必要再重複一下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」)    另乙個功能強大的比較函式是成員函式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一竅不通?靠,你重修吧!

字串操作是乙個不小的主題,在標準c++中,string字串類成為乙個標準,之所以拋棄char*的字串而選用c++標準程式庫中的string類,是因為他和前者比較起來,不必擔心記憶體是否足夠、字串長度等等,而且作為乙個類出現,他整合的操作函式足以完成我們大多數情況下的需要. 

下面我們首先從一些示例開始學習下string類的使用. 

1) #include

#include

using namespace std;

void main() 

15) 

//replace() 替換字元 

#include

#include

using namespace std;

void main() 

17) 

//size(),length()  返回字元數量 

#include

#include

using namespace std;

void main() 

18) 

//max_size() 返回字元的可能最大個數 

#include

#include

using namespace std;

void main() 

19) 

//empty()  判斷字串是否為空 

#include

#include

using namespace std;

void main() 

20) 

// [ ], at() 訪問單一字元 

#include

#include

using namespace std;

void main() 

乙個c++字串存在三種大小:a)現有的字元數,函式是size()和length(),他們等效。 empty()用來檢查字串是否為空。b)max_size() 這個大小是指當前c++字串最多能包含的字元數,很可能和機器本身的限制或者字串所在位置連續記憶體的大小有關係。我們一般情況下不用關心他,應該大小足夠我們用的。但是不夠用的話,會丟擲length_error異常c)capacity()重新分配記憶體之前 string所能包含的最大字元數。這裡另乙個需要指出的是reserve()函式,這個函式為string重新分配記憶體。重新分配的大小由其引數決定,預設引數為0,這時候會對string進行非強制性縮減

精講母函式

在數學中,某個序列的母函式 generating function,又稱生成函式 是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。使用母函式解決問題的方法稱為母函式方法。母函式可分為很多種,包括普通母函式 指數母函式 l級數 貝爾級數和狄利克雷級數。對每個序列都可以寫出以上每個型別的乙個...

精講母函式

在數學中,某個序列的母函式 generating function,又稱生成函式 是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。使用母函式解決問題的方法稱為母函式方法。母函式可分為很多種,包括普通母函式 指數母函式 l級數 貝爾級數和狄利克雷級數。對每個序列都可以寫出以上每個型別的乙個...

lua函式精講 一

函式的用途 1.完成指定的任務,這種情況下作為呼叫語句使用。2.計算並返回值,這種情況下,函式作為賦值語句的表示式使用。函式的引數為空,必須使用 表示函式呼叫。例外 當函式只有乙個引數,並且這個引數是字串或表構造時,是可選的。lua提供了物件導向呼叫函式的語法 o foo x 與o.f o,x 是等...