之所以拋棄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.字串操作函式
a) =,assign() //賦以新值
b) swap() //交換兩個字串的內容
d) insert() //插入字元
e) 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) << //將謀值寫入stream
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 2.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*上去。同時我們也祈禱現在仍然使用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") > 從輸入流讀取乙個string。
2.<< 把乙個string寫入輸出流。
另乙個函式就是getline(),他從輸入流讀取一行內容,直到遇到分行符或到了檔案尾。
2.8搜尋與查詢
查詢函式很多,功能也很強大,包括了:
find()
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()
這些函式返回符合搜尋條件的字元區間內的第乙個字元的索引,沒找到目標就返回npos。所有的函式的引數說明如下:
第乙個引數是被搜尋的物件。第二個引數(可有可無)指出string內的搜尋起點索引,第三個引數(可有可無)指出搜尋的字元個數。比較簡單,不多說不理解的可以向我提出,我再仔細的解答。當然,更加強大的stl搜尋在後面會有提及。
最後再說說npos的含義,string::npos的型別是string::size_type,所以,一旦需要把乙個索引與npos相比,這個索引值必須是string::size)type型別的,更多的情況下,我們可以直接把函式和npos進行比較(如:if(s.find("jia")==
string::npos))。
c 中的string用法
向string 的後面加字元或字串。比 push back 更靈活 1 向string 的後面加c string basic type ptr string s hello s hello const char c out there s hello out there 2 向string 的後面加...
c 中string的用法
c 中string的用法 string在c 中是作什麼用的阿?既有string str宣告變數的,也有string n,的,我是新手,謝謝了。之所以拋棄char 的字串而選用c 標準程式庫中的string類,是因為他和前者比較起來,不必 擔心記憶體是否足夠 字串長度等等,而且作為乙個類出現,他整合的...
C 中string的用法
之所以拋棄char 的字串而選用c 標準程式庫中的string類,是因為他和前者比較起來,不必 擔心記憶體是否足夠 字串長度等等,而且作為乙個類出現,他整合的操作函式足以完成我們大多數情況下 甚至是100 的需要。我們可以用 進行賦值操作,進行比較,做串聯 是不是很簡單?我們盡可以把它看成是c 的基...