string详解
procedure TForm1.Button1Click(Sender: TObject);
var
a,b: array[0..19] of char;
i: Integer;
s, str: string;
begin
FillChar(a, SizeOf(a), 0);
FillChar(b, SizeOf(a), 0);
for i:= 0 to 9 do
a[i]:= chr($30+i);
ShowMessage(a); //'0123456789'
StrCat(@a,'wertyui');
s:= StrPas(@a[0]);
ShowMessage(s); //'0123456789wertyui'
StrCopy(@b,@a);
StrCopy(@a,'asdfghj');
ShowMessage(a); //'asdfghj'
ShowMessage(b); //'0123456789wertyui'
SetLength(str,20);
StrCopy(@str[1],@b);
ShowMessage(str); //'0123456789wertyui'
SetLength(str,0);
// StrMove()
end;
procedure TForm1.btn1Click(Sender: TObject);
var
str: string;
begin
str:= 'atrzxcZXcZXcZXcZXcZXcZXXCzXCZZXcxzvZXCZcZXCZX';
ShowMessage( IntToStr(Integer(@str))+';'#$0D#$0A+ //1635712
inttostr(Integer(@str[1]))+';'#$0D#$0A+ //2958704 字符串首地址
inttostr(Integer(@str[2]))); //2958705
ShowMessage(IntToStr(SizeOf(str))); //4 str变量是个指针
end;
procedure TForm1.btn2Click(Sender: TObject);
const
TempString: array[0..15] of Char = 'This is a test.'#0;
var
Text: PChar;
begin
// Text := @TempString[0]; //字符数组首地址
Text := @TempString; //字符数组首地址
ShowMessage(IntToStr(Integer(@TempString[0]))+';'+IntToStr(Integer(@TempString)));
{Text指向Null结尾的TempString字符数组的第0个元素的地址,
也就是整个字符数组的首地址}
MessageBox(0, Text, 'Test Message', 0);
end;
procedure TForm1.btn3Click(Sender: TObject);
var
Text1: array[0..14] of Char; { 大小为15个字符}
Text2: array[0..20] of Char; { 大小为21个字符}
Text3: PChar;
begin
Text1 := 'This is a test'#0; {Text1和Text2的字符长度都为15个字符}
Text2 := 'This is a test.';
MessageBox(0, Text1, 'Test Message 1', 0);
{因为Text1的字符长度超过了其声明的大小,因为会内存访问混乱,显示换乱}
MessageBox(0, Text2, 'Test Message 2', 0);
{Text2的字符长度比起声明的大小要小,因为正常访问,显示正确}
Text3:= PChar('aabbcc'#100#100#0#101);
ShowMessage(Text3+';'+IntToStr(Length(Text3)));
//8 Pchar以#0结尾,但#0不计入Pchar长度
end;
Delphi 将string 转为 Array of AnsiChar
procedure TForm1.btn1Click(Sender: TObject);
var
ms: TMemoryStream;
str: string;
arr, arr2: array of Char;
p: PChar;
iLen: Integer;
begin
New(p);
ms:= TMemoryStream.Create;
ms.LoadFromFile('C:\Users\Administrator\Desktop\新建文本文档.txt');
iLen:= ms.Size;
SetLength(str,iLen);
SetLength(arr,iLen);
SetLength(arr2,iLen);
ms.ReadBuffer(str[1],iLen);
MoveMemory(@arr[0],@str[1],iLen);
p:= @arr[0];
StrCopy(@arr2[0],p);
ShowMessage(str+ p);
end;
procedure TForm1.btn2Click(Sender: TObject);
var
ms: TMemoryStream;
arr, arr2: array of Char;
iLen: Integer;
begin
ms:= TMemoryStream.Create;
ms.LoadFromFile('C:\Users\Administrator\Desktop\新建文本文档.txt');
iLen:= ms.Size;
SetLength(arr,iLen);
ms.ReadBuffer(arr[0],iLen);
SetLength(arr2,iLen);
CopyMemory(@arr2[0],@arr[0],iLen);
ShowMessage('a');
end;
procedure TForm1.btn3Click(Sender: TObject);
var
ms: TMemoryStream;
str: string;
arr: array of Char;
iLen: Integer;
begin
ms:= TMemoryStream.Create;
ms.LoadFromFile('C:\Users\Administrator\Desktop\新建文本文档.txt');
iLen:= ms.Size;
SetLength(str,iLen);
SetLength(arr,iLen);
ms.ReadBuffer(str[1],iLen);
CopyMemory(@arr[0],@str[1],iLen); //@arr[0]时,成功
SetLength(arr,50); //@arr时,失败
ShowMessage(str);
end;
procedure TForm1.btn4Click(Sender: TObject);
var
ms: TMemoryStream;
str,str2: string;
iLen: Integer;
begin
str:= '0123456789';
ms:= TMemoryStream.Create;
ms.WriteBuffer(str[1],length(str));
iLen:= ms.Size;
SetLength(str2,iLen);
ms.Position:= 0; //注意,从0开始(前边用了WriteBuffer)
ms.ReadBuffer(str2[1],iLen);
showmessage(str2);
end;