C 字串處理string

2021-08-06 02:07:29 字數 3944 閱讀 4444

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

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

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

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)現有的字元數,函式是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*上去。

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 更改內容

題取子串的函式是:substr(),形式如下:

s.substr();//返回s的全部內容

s.substr(11);//從索引11往後的子串

s.substr(5,6);//從索引5開始6個字元

把兩個字串結合起來的函式是+。(誰不明白請致電120)

2.7輸入輸出操作

1.>> 從輸入流讀取乙個string。

2. < < 把乙個string寫入輸出流。

另乙個函式就是getline(),他從輸入流讀取一行內容,直到遇到分行符或到了檔案尾。

2.8搜尋與查詢

【std::string 轉換大小寫】 很遺憾,std::string 沒有提供大小寫轉換的功能,所以只能用stl中的transform結合toupper/tolower完成。

標頭檔案: string, cctype,algorithm

轉小寫

transform(str.begin(), str.end(), str.begin(), :

:tolower);

轉大寫

transform(s.begin(), s.end(), s.begin(), :

:toupper);

字串處理 string型別

string型別變數的賦值與連線 s是字串變數名 一 string s 字串 定義並初始化 二 string s 個數,字元 定義並初始化為若干相同字母 三 string s 字串 定義並初始化賦值 四 s 字元 字串變數名 連線字串 string型別的運算 成員函式指某個型別的特有函式,其呼叫方式...

c 基礎 字串的處理 string類

string型別可以看作char的唯讀陣列 如 string s hello world for int i 0 ic 中字串有乙個重要的特性 不可變性,字串一旦宣告就不再可以改變,所以只能通過索引來讀取指定位置的char,不能對指定位置的char進行修改。如果要對char進行修改,那麼就必須建立乙...

字串String的 簡單處理

1 charat int index 獲取指定位置的字元 public class teststring 2 tochararray 獲取對應的字串陣列 converts this string to a new character array.public class teststring 3 擷...