strings 字串 詳解 一

2021-08-22 09:36:06 字數 3524 閱讀 5519

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

好了,進入正題………

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

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

1.宣告乙個c++字串

宣告乙個字串變數很簡單:

stringstr;

這樣我們就宣告了乙個字串變數,但既然是乙個類,就有構造函式和析構函式。上面的宣告沒有傳入引數,所以就直接使用了string的預設的構造函式,這個函式所作的就是把str初始化為乙個空字串。string類的構造函式和析構函式如下:

a)strings;//生成乙個空字串s

b)strings(str) //拷貝構造函式生成str的複製品

c)strings(str,stridx) //將字串str內「始於位置stridx」的部分當作字串的初值

d)strings(str,stridx,strlen) //將字串str內「始於stridx且長度頂多strlen」的部分作為字串的初值

e)strings(cstr) //將c字串作為s的初值

f)strings(chars,chars_len) //將c字串前chars_len個字元作為字串s的初值。

g)strings(num,c) //生成乙個字串,包含num個c字元

h)strings(beg,end) //以區間beg;end(不包含end)內的字元作為字串s的初值

i)s.~string() //銷毀所有字元,釋放記憶體

都很簡單,我就不解釋了。

2.字串操作函式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) <

還有必要再重複一下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異常。

有乙個例外不得不說,conststringa;的操作符對索引值是a.length()仍然有效,其返回值是』\0』。其他的各種情況,a.length()索引都是無效的。舉例如下:

conststringcstr(「conststring」);

stringstr(「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比較函式erase()的形式也有好幾種(真煩!),替換函式replace()也有好幾個。舉例吧:

strings=」il8n」;

s.replace(1,2,」nternationalizatio」);//從索引1開始的2個替換成後面的c_string

字串詳解

1.字串的屬性 length 2.字串方法 獲取類charat 指定字元 str.charat 1 表示取第2個字元。charcodeat 指定字元的編碼 就是ascii碼 文字 編碼 var str abc str.charcodeat 0 97 var str abc str.charcodea...

字元與字串詳解

4.字串的其他方法 5.位元組陣列與字串 6.小結 字元型別char是基本資料型別,它是character的縮寫。乙個char儲存乙個unicode字元 char c a char d 1 char e 和char型別不同,字串型別string是引用型別,我們用雙引號 表示字串。乙個字串可以儲存0個...

判斷字串 一文詳解Python字串條件判斷方法

作者 張小吉 前言 人喜歡為自己的錯誤,找各種藉口開脫。本週做演算法題leetcode 394.字串解碼 的時候遇到了這樣的問題,題目需要完成 s 3 a 2 bc 返回 aaabcbc 實現的過程中,需要判斷乙個字串是否為數字,幾乎條件反射地,打算自己實現乙個從0 9的字串list,然後判斷字元是...