1. 程式人生 > >Delphi 的字符及字符串 string、AnsiString、WideString、String[n]、ShortString

Delphi 的字符及字符串 string、AnsiString、WideString、String[n]、ShortString

ssa 寬字符串 set setlength 內存 如果 指定大小 spa 字符

//最常用的 string
var
  str: string;   {定義}
begin
  str := ‘萬一‘; {賦值}
  ShowMessage(IntToStr(Length(str))); {長度是: 4}
end;

//長字符串 AnsiString; 在當前版本(2007)中的默認狀態下, String 就是 AnsiString
var
  str: AnsiString;
begin
  str := ‘萬一‘;
  ShowMessage(IntToStr(Length(str))); {長度是: 4}
end;

//寬字符串 WideString (效率不及 AnsiString)
var str: WideString; begin str := ‘萬一‘; ShowMessage(IntToStr(Length(str))); {長度是: 2} end;

//定長字符串
var
  str1: String[6]; {指定大小不能超過 255}
  str2: String[100];
begin
  {少給了也會占那些內存}
  str1 := ‘萬一‘;
  ShowMessage(str1);                   {萬一}
  ShowMessage(IntToStr(Length(str1))); {4; 這是字符串的長度}
  ShowMessage(IntToStr(SizeOf(str1))); {7; 這是占內存大小}
{多給了會被截斷} str1 := ‘萬一的 Delphi 博客‘; ShowMessage(str1); {萬一的} ShowMessage(IntToStr(Length(str1))); {6; 這是實際保存的字符串長度} ShowMessage(IntToStr(SizeOf(str1))); {7; 這是占內存大小} {問題: 不是聲明大小為 6 嗎? 怎麽 SizeOf 是 7 ? } {因為定長字符串會多出一個首字節來記憶字符串的實際長度} {舉例說明, 如果給 str2 按如下賦值, 那它的首字節(str2[0])肯定儲存著字符 ‘A‘}
str2 := ‘iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii‘; {65個} ShowMessage(str2[0]); {A} ShowMessage(IntToStr(Ord(str2[0]))); {65; 這是 ‘A‘ 在 ASCII 序列中的序號, 用的就是它} {那以後可以用 Ord(str2[0]) 來代替 Length 判斷字符串的長度嗎? } {對定長字符串是可以的; 不但能讀取, 還可以像 SetLength 一樣設置} end;

//ShortString; 它相當於 String[255]
var
  str: ShortString;
begin
  str := ‘萬一的 Delphi 博客‘;
  ShowMessage(str);                   {萬一的 Delphi 博客}
  ShowMessage(IntToStr(SizeOf(str))); {256; 這是大小}
  ShowMessage(IntToStr(Length(str))); {18 ; 這是實際長度}
  ShowMessage(IntToStr(Ord(str[0]))); {18 ; 這是從首字節中取出的長度}
end;

Delphi 的字符及字符串 string、AnsiString、WideString、String[n]、ShortString