c string類詳解 學會絕對有用

2021-05-22 20:57:29 字數 3301 閱讀 1410

之所以拋棄char*的字串而選用c++標準程式庫中的string類,是因為他和前者比較起來,不必擔心記憶體是否足夠、字串長度等等,而且作為乙個類出現,他整合的操作函式足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 = 進行賦值操作,== 進行比較,+ 做串聯(是不是很簡單?)。我們盡可以把它看成是c++的基本資料型別。

好了,進入正題………

首先,為了在我們的程式中使用string型別,我們必須包含標頭檔案 。如下:

#include //注意這裡不是string.h string.h是c字串標頭檔案

還有必要再重複一下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()

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進行非強制性縮減

C string類的詳解

from 之所以拋棄char 的字串而選用c 標準程式庫中的string類,是因為他和前者比較起來,不必擔心記憶體是否足夠 字串長度等等,而且作為乙個泛型類出現,他整合的操作函式足以完成我們大多數情況下 甚至是100 的需要。我們可以用 進行賦值操作,進行比較,做串聯 是不是很簡單?我們盡可以把它看...

CString剖析與詳解

1 cstring實現的機制 cstring是通過 引用 來管理串的,象window核心物件 com物件等都是通過引用來實現的。而cstring也是通過這樣的機制來管理分配的記憶體塊。實際上cstring物件只有乙個指標成員變數,所以任何cstring例項的長度只有4位元組.正因為如此,乙個這樣的記...

C string庫函式詳解

連線字串 字串賦值 字串比較 例如a b,aa ab 比較字串 輸出 輸入字串 注意 使用過載的運算子 時,必須保證前兩個運算元至少有乙個為 string 型別。例如,下面的寫法是不合法的 1 include 2 include 3int main 42.1 find 查詢函式 1 str.find...