關於Delphi中的字串的詳細分析

2022-08-02 21:18:13 字數 4106 閱讀 4999

只是淺淺的解析下,讓大家可以快速的理解字串。

其中的所有**均在delphi7下測試通過。

delphi 4,5,6,7中有字串型別包括了:

1、短字串(short string

固 定長度,最大字元數個數為255,短字串也成為長度位元組(length-byte)字串,這時因為短字串的第0個元素包含了這個字串的長度(字元 串中字元的個數)。因此shortstring的預設最大長度為256個位元組(255個字元+1個長度位元組=256),宣告乙個短字串有兩種方式,如 下:

var 

s: shortstring;    

s1: string[255];   

len: integer; 

begin 

s := 'hello'; 

len := ord(s[0]);  

len := sizeof(s);   

end; 

以上例子通過s[0]可以獲得s的字串長度,當然也可以用length函式來確定乙個短字串的長度。

可以通過陣列的下標來訪問shortstring中的乙個特定位置的字元,具體使用參看下面例子和注釋說明:

var 

s: string[8]; 

i: integer; 

begin 

s := 'a_pretty_darn_long_string'; 

i := 10; 

s[i] := 's'; 

end; 

2、長字串(long string

長字串 (ansistring)是一種動態分配的字串,其大小只受可用記憶體的限制。宣告乙個長字串,只需要用關鍵字string不加大小引數即可。

在delphi 7中ansistring包含的字元是用單位元組儲存的。

var 

s: string;

由於是動態分配的,一次可以隨意修改字串,而不用擔心對其他的影響,也不用擔心越界的問題。string型別沒有0元素,試圖訪問string型別的0元素會產生乙個編譯錯誤。

通過length函式也可以獲得長字串的長度,也可以通過setlength過程為長字串設定長度。其在記憶體中分配情況如下:

3、寬字串(wide string

寬字串和長字串一樣,大小只受有效記憶體的限制,並實行動態分配。

在delphi 7 中widestring被實現為2個位元組儲存乙個字元,用widestring來處理多位元組字元是十分方便的。如:

var 

s: string; 

ws: widestring; 

begin 

s := '世界你好'; 

ws := s; 

showmessage(s[1]);   

showmessage(ws[1]);  

end; 

4、零結尾字串(null-terminated string)、pchar和字元陣列

在c和c++中沒有真正的字串資料型別,都是通過以null結尾(0)的字元陣列來實現的,字元陣列沒有長度位元組,因此只能通過結尾的null標 志來作為字串的字元結束標誌。又因為windows是用c編寫的,很多windows函式要用到以字元陣列作為引數,但pascal字串型別不是字元 陣列,因為為了讓pascal字串也能與windows相容,就需要乙個字串陣列,pchar型別正是符合這種需求,在任何需要字元陣列的地方都可用 pchar。

雖然ansistring和widestring都已經實現了null

相應的也有pansichar和pwidechar,分別對應於ansichar字元和widechar字元。

例如:windows messagebox函式,此函式宣告如下:

function messagebox(hwnd: hwnd; lptext, lpcaption: pchar; utype: uint): integer; stdcall; 

第二個和第三個引數需要乙個指向字元陣列的指標,為了可以呼叫此函式,有以下三種方法來實現

1pchar()型別轉換

var 

text: string; 

caption: string; 

begin 

text := 'this is a test.'; 

caption := 'test message'; 

messagebox(0, pchar(text), pchar(caption), 0); 

end; 

其中2pchar變數

我們先做乙個實現,看看pchar型別到底是啥呢?

執行下面程式

var 

text: pchar;     

str: string;     

begin 

text := 'this is a test.';              

str := 'this is a test.'; 

showmessage(inttostr(sizeof(text)));    

showmessage(inttostr(sizeof(str)));     

end; 

通過上面的程式,我們知道text只不過是乙個指標而已。

var 

text: pchar; 

begin 

text := 'this is a test.'; 

messagebox(0, text, 'test message', 0); 

end; 

指標text指向了這樣乙個記憶體區域,乙個包含null的結尾的』this is a test』字串的區域。其等同於下面的**:

const 

tempstring: array[0..15] of char = 'this is a test.'#0; 

var 

text: pchar; 

begin 

text := @tempstring[0]; 

messagebox(0, text, 'test message', 0); 

end; 

3char型別字元陣列

最有還可以用char陣列來代替pchar,**如下:

var 

text1: array[0..14] of char;   

text2: array[0..20] of char;   

begin 

text1 := 'this is a test.';    

text2 := 'this is a test.'; 

messagebox(0, text1, 'test message 1', 0); 

messagebox(0, text2, 'test message 2', 0); 

end; 

顯示結果如下:

關於字串就先淺淺的談到這個,以後再深入了解。

Delphi中的字串

delphi中的字串 一 各種字串 字串是object pascal所有資料型別中最有用的型別。許多函式以字串為傳遞引數。由於在delphi中字串的定義和使用有各種方式,包括pascal中典型的字串 string delphi支援的長字串 ansistring 類似於c語言的字元陣列 array o...

關於Delphi的字串管理

1 呼叫了strnew之後要呼叫strdispose,否則會有記憶體洩露。而stringlist的gettext方法中呼叫了strnew,所以如果你用了gettext,必須接著用strdispose。2 function gettextstr strlist tstringlist string v...

用好Delphi中的字串

一 各種字串 字串是object pascal所有資料型別中最有用的型別。許多函式以字串為傳遞引數。由於在delphi中字串的定義和使用有各種方式,包括pascal中典型的字 符串 string delphi支援的長字串 ansistring 類似於c語言的字元陣列 array of char 指向...