字符串 字符数组 MemoryStream(100分)

  • 主题发起人 主题发起人 tdp
  • 开始时间 开始时间
T

tdp

Unregistered / Unconfirmed
GUEST, unregistred user!
字符串和字符数组如何转换, 是不是只有strcopy()
使用动态数组,静态数组都可以编译通过,但只有静态数组可以得到正确结果。
如下代码:
//可以得到正确结果
s: string;
a: array [0 .. 10] of char;
strcopy(@a, Pchar(s));

//不可以得到正确结果
s: string;
a: array of char;
setlength(a, length(s));
strcopy(@a, Pchar(s));
strcopy(@a, Pchar(s));
 
StrLCopy........
 
用COPY即可
 
var
s: string;
a: array of char;
begin
setlength(a, length(s));
strcopy(PChar(a), Pchar(s));
ShowMessage(PChar(a));
这样就可以了
 
动态数组,代表数组的那个变量是一个指针,如果要进行你那样的复制操作,
需要@a[0],而不是@a,@a[0]代表数组的第一个元素的地址,@a代表的是指针变量a的地址,那可是一个指向指针的指针啊
(动态数组,a实际上就是@a[0])
 
muhx的代码是正确的。
可为什么我的代码使用静态数组可以得到正确结果
 
var
a: array of char;
s: string;
begin
s:= 'abcd';
setlength(a, length(s));
strcopy(a, pchar(s));
//或者 strcpy(@a[0], pchar(s));
showmessage(string(a));
end;
 
s:= 'abcd';
l:= length(s);
setlength(a, l);
strcopy(@a[0], pchar(s));
showmessage(string(a));显示多一个字符'abcd?'
 
那是你showmessage时强制类型转换的时候出的问题
如果安全起见,你最好多分配一个字符给动态数组
setlength(a, l + 1);
 
回到我最早的问题
var
ms: TMemoryStream;
s1, s2: string;
len: integer;
begin
s1:= 'asdf';
s2:= '';
len:= length(s1);
ms:= TMemoryStream.Create;
ms.write(s1, length(s1));

ms.Position:= 0;
ms.read(s2, len);
showmessage(s2);
ms.Free;
end;
上面的代码没有错误吧?
再看下面的 Client 发送
var
ms: TMemoryStream;
s: string;
begin
s:= 'abcd';
ms:= TMemoryStream.Create;
ms.write(s, length(s));
CS.Socket.SendBuf(ms.Memory^, ms.Size);
ms.Free;
end;

Server 接收
var
len: integer;
ms: TMemoryStream;
s: string;
begin
len:= Socket.ReceiveLength;
ms:= TMemoryStream.Create;
ms.Size:= len;
Socket.ReceiveBuf(ms.Memory^, len);
ms.read(s, len);
showmessage(s);
ms.Free;
end;
 
怎么没人回答了,
其实还是指针和内存地址的问题
 
var
s: string;
a: array [0 .. 10] of char;
b:array of char;

1.
StrPCopy(a,s);
2.
SetLength(b,Length(s));
StrPCopy(@b,s);
 

Similar threads

后退
顶部