ansistring類是bcb中最常見類之一,了解它對以後深入學習bcb大有幫助。
介紹ansistring類之前,先要介紹一些背景知識。vcl(visual component library 視覺化元件庫)大量利用pascal長字串資料型別,幾乎所有基於文字的vcl屬性都採用pascal長字串。例如,text、name和caption屬性都是pascal長字串屬性。vcl的許多構件方法和事件處理函式也採用pascal長字串。由於vcl大量使用pascal長字串,而c++ builder使用pascal vcl,所以borland生成乙個c++類來近似pascal長字串,這個類就是ansistring類,可以代替pascal長字串。
ansistring類是功能很強的字串類。ansistring類的記憶體空間是動態分配的,引用計數,並使用了更新前拷貝(copy-on-write)技術。這類字串長度沒有限制,其字元型別是ansichar
型別。ansistring類構造器可以從char、char*、int或double生成ansistring類物件。這些構造器很容易將直接字串賦予ansistring類並將整數或浮點數變成字串。
字串比較:「==」、「>」、「<」、「<=」、「>=」、「!=」
·訪問:「」,用此操作符可以象陣列一樣訪問字串中的字元。注意:這個地方和c中陣列的用法不相容,第乙個字元的下標是1,而不是0。當下標為0時,會丟擲乙個異常。下面的討論中提及第index個字元的都是與此相同,不再說明。
方法:1. char* c_str()
返回當前的物件的字串空間的首指標,它指向的內容即ansistring中包含的字串。
example:
ansistring str = "hello world!";
showmessage(str.c_str()); // 顯示乙個hello world!的訊息框
能否用這個返回值訪問/修改字串中的內容?
example:
ansistring a = "i want to modify this using pointer";
char *p = a.c_str();
p[0] = 'i';
........
//指標操作
showmessage(a);
可以,但不推薦!
因為ansistring是動態分配的,所以該字元指標不是永遠不變的,而是隨時會變的,所以該指標只是乙個臨時的指標,不要永久的儲存,因為說不定什麼
時候就「野」了。當需要修改字串的內容時,用操作符或用類提供的方法(insert、delete等)完全可以實現。
2.ansistring& delete(int index, int count)
在字串中刪除從index開始的count個字元。如果index大於字串的長度,則此方法不刪除任何字元;如果count大於從index開始的剩餘字元數目,則此方法刪除從
index 開始的所有字元。
3.ansistring& insert(const
ansistring& str, int index)
在字串的index位置插入字串str。
4.int ansicompare(ansistring& rhs)
比較兩個ansistring的內容是否相同,與「==」的區別在於當內容相等的時候前者返回0,而後者返回true。
int ansicompareic(ansistring& ths)
不區分大小寫的比較。
5.int length()
返回字串長度,不包括終止符'\0'!
6.bool isempty() const
判斷字串是否為空。
7.ansistring substring(int index, int count)
返回乙個新的ansistring, 內容為原字串從第index個字元開始,長度為count子串。
example:
ansistring str = "hello world!";
showmessage(str.substring(7, 5)); // 顯示內容為 world
8.int pos(ansistring& substr)
查詢內容為substr的字串,如果有,返回字串的第乙個字元位置 如果沒有,返回0。
9.ansistring lowercase()
ansistring uppercase()
返回乙個新的ansistirng, 為當前字串轉化為小寫/大寫的結果。
10. ansistring& setlength(int newlength)
返回字串的length屬性為newlength,內容是原字串中1-newlength的內容。
11.static ansistring formatfloat(const
ansistring& format, const long
double& value)
將value用format指定的格式轉換為字串形式。
12.ansistring& sprintf(char *, ...)
利用sprintf強大功能格式化當前字串,詳細用法請參考sprintf或者printf
13.int toint() const
int tointdef(int defaultvalue)
const
返回當前字串轉化為整數的結果,不同點在於,當不能轉化時,前者丟擲乙個異常,而後者返回defaultvalue。
double todouble() const
將字串轉換為乙個浮點數。如果字串無可用的轉換字元,則產生異常。
14.static ansistring inttohex(int value, int digits)
將乙個整數轉換為16進製制的字串形式。
15.ansistring trim() const
返回乙個新字串,新字串中刪除了原字串中前導和後隨的空字串,以及字串中的控制字元。常用於輸出字串時刪除前面和後面的空格。
ansistring trimleft()
const
ansistring trimright()
const
分別刪除字串前導和後隨的空格字元以及控制字元。
注意:處理不了全形的空格。
16.char* ansilastchar()
返回字串的最後乙個字元。
17.static ansistring stringofchar(char ch, int count)
返回乙個包含count個字元ch的字串。
相關函式(詳細的請參閱bcb help):
booltostr() // 將bool型別轉換成ansistring
strtoboll()
inttostr() // 將int轉換成ansistring
strtofloat() // 將ansistring轉換成float
floattostr()
stringtocolor() // 將ansistring轉換成tcolor類
colortostring
其他:看下面的**:
ansistring src="test ansistring";
ansistring strtest=src; //拷貝構造
char* cp=strtest.c_str();
cp[0]='t';
執行完後,strtest和src的值是什麼呢?結果可能與你所預想的大不相同,兩都的值都變成了"testansistring"!也就是說
cp[0]='t'的操作同時改變了兩個ansistring變數的值。為什麼會這樣呢,執行時按下ctrl滑鼠單擊兩個變數名,你會發現它們兩個所指
向內部字串是同乙個!也就是說在拷貝構造(賦值也一樣)時並沒有象我們想象的那樣進行內部字串的複製!
再看下面的**:
ansistring src="test ansistring";
ansistring strtest=src; //拷貝構造
strtest[1]='x';
char* cp=strtest.c_str();
cp[0]='t';
執行結果就是我們的預期了,為什麼加了句strtest[1]='x';就"正常"了呢?很明顯ansistring為了我們第乙個問題中的效率問題採用
了copy
onwrite技術,也就是唯讀共享,寫時拷貝。這樣只有在物件要改變其內部資料的值時才做乙份自己的拷貝然後在自己的拷貝中進行修改(就種技術在作業系統中
被廣泛使用)。同時在物件析構時如果引用計數大於0,資料也不會被刪除,它保證資料的有效性。這樣返回ansistring變數的函式也就沒有嚴重的效率
問題了。
BCB中AnsiString類方法總結
ansistring類是bcb中最常見類之一,了解它對以後深入學習bcb大有幫助原來關於這個類的提出的問題有很多,現總結如下。加上我個人的經驗,湊出了一篇關於這個類的最常用方法屬性的介紹,希望能對各位有所幫助 常用方法 1.char c str 返回乙個字串指標,他指向的內容和ansistring中...
BCB中AnsiSting類方法總結
bcb中ansisting類方法總結 ansistring類是bcb中最常見類之一,了解它對以後深入學習bcb大有幫助原來關於這個類的提出的問題有很多,現總結如下。加上我個人的經驗,湊出了一篇關於這個類的最常用方法屬性的介紹,希望能對各位有所幫助 常用方法 1.char c str 返回乙個字串指標...
BCB中接收郵件的例子
來自csdn的 onlyux 從name1 163.com裡取出郵件 label1 caption 正在連線伺服器.if nmpop31 connected nmpop31 disconnect nmpop31 attachfilepath nmpop31 deleteonread false nm...