只是淺淺的解析下,讓大家可以快速的理解字串。
其中的所有**均在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;
第二個和第三個引數需要乙個指向字元陣列的指標,為了可以呼叫此函式,有以下三種方法來實現
1、pchar()型別轉換
var
text: string;
caption: string;
begin
text := 'this is a test.';
caption := 'test message';
messagebox(0, pchar(text), pchar(caption), 0);
end;
其中2、pchar變數
我們先做乙個實現,看看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;
3、char型別字元陣列
最有還可以用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 指向...