string 類主要函式操作筆記
string s=」123」,s2=」1」;
s.find(s2,pos) //pos尋找的起始位置, 找不到返回string::npos;找到返回找的起始位置
s.rfind(s2,pos) //倒著找;
using namespace std;
if(str1.compare(str2) !=0)
cout << str1 << " is not " << str2 << endl;
if(str1.compare(6, 5, str2, 4, 5) == 0)
return 0;
r) copy() //將某值賦值為乙個c_string
s) c_str() //將內容以c_string返回
t) data() //將內容以字元陣列形式返回 data()以字元陣列的形式返回字串內容,但並不新增』\0』
s.insert(2,」z」); //s=」aszdfg」
s.insert(2, 「qwegt」, 3); //s=」asqwezdfg」。
/const string a1 = 「zxc」; s.insert(2,a1); //錯誤/
s.insert(2, 「zxcv」, 2, 2); //s=」ascvqwezdfg」
string s=st.substr(pos,len); //取子串
s.erase(2,2); //s=」asg」,從下標2開始刪除2個,s = 「asdfg」;
s.erase(s.begin(), s.begin() + 3); //s=」fg」,s = 「asdfg」;
s.erase(4); //s=」asdf」,刪除下標4的值,s = 「asdfg」;
s.erase(s.begin() + 4); //s=」asdf」,刪除下標4的值。
s.erase(s.begin(), s.end()); //s=」 「,s.end()是末尾元素下乙個
注意不是cstring
之所以拋棄char*的字串而選用c++標準程式庫中的string類,是因為他和前者比較起來,不必 擔心記憶體是否足夠、字串長度等等,而且作為乙個類出現,他整合的操作函式足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 = 進行賦值操作,== 進行比較,+ 做串聯(是不是很簡單?)。我們盡可以把它看成是c++的基本資料型別。
好了,進入正題………
首先,為了在我們的程式中使用string型別,我們必須包含標頭檔案 。
如下:using namespace std;
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.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」)
postgresql函式相關操作筆記
create or replace function aa1 a2 bigint returns void as dec lare iiin tege r be gini i 1 for iiin 1.a2l oop sel ecti i in sert into test id,bill no v...
vi 操作筆記
1.關於退出 wq 強制儲存退出 wq 儲存退出 x 作用和 wq 一樣 zz 作用和 wq一樣,注意z是大寫的,並且不是在命令模式 q 退出 q 強制退出 2.關於移動 h 在當前行向左移動乙個字元 j 移動到下一行 k 移動到上一行 l 在當前行向右移動乙個字元 ctrl f 向前滾動一頁 ct...
mysql操作筆記
user01只能本地訪問 create user user01 localhost identified by password1 user02可以遠端訪問 create user user02 identified by password1 建立資料庫 create database db01 修...