★请进,如何复制字符串?不是赋值。★(100分)

  • 主题发起人 主题发起人 GOHKI
  • 开始时间 开始时间
G

GOHKI

Unregistered / Unconfirmed
GUEST, unregistred user!
如何复制字符串?
代码:
var
  str1, str2: string;
begin
  str1 := 'abcdefg';
  [red][b]str2 := str1;[/b][/red]
end.
这样赋值是否只是增加了str1的引用计数,而str1和str2指向同一段内存空间?
如何才能真正复制字符串?
 
str2 := str1就是拷贝.
例如:
str1 := 'abcdefg';
str2 := str1;
str1 := '123'
结果 str1 : '123'
str2 : 'abcdefg'
 
我记得书上说直接赋值只是增加引用计数,这样赋值修改str2也会改变str1。
到底是不是这样?
 
你直接试试就知道了,有些是会这样,不过不是在这里。
 
究竟应该怎样区分?
 
这样肯定可以。

var str1,str2:string;
pstr:pchar;
begin
str1:='abcdefg';
pstr:=allocmem(length(str1)+1);
strpcopy(pstr,str1);
str2:=strpas(pstr);
end;
 
也没有怎么区分的,你试试就知道了,然后你记住就可以了。就是这么简单。[:)]
 
var
str1, str2: string;
begin
str1 := 'abcdefg';
str2 := str1;
end
以上操作就是复制字符串,
而比如指针类型才是志向地址。

 
str1 := '123';
str2 := str1;
这样在内存中str1和str2都是指向一个地方,也就是你所说的引用计数,并没有进行字符
串的拷贝,目的是为了节省内存空间,但是一旦str1或str2有变化,马上就会进行拷贝操作,
str1和str2不是指向同一地址了,不会像你想的那样修改str2也会改变str1。
 
大家说的都对,我试过了,这样做确实是复制。
但究竟什么情况才是增加引用计数?
 
代码:
var
  str1, str2: string;
begin
  str1 := 'abcdefg';
  Str2 := Copy(Str1, 1, Length(Str1));
end.
 
当两个串是简单赋值时是增加引用计数, 修改任何一个都会减少引用计数而重新开辟一个.
如果非要复制,标准的作法是:
SetLength(Str2, Length(Str1));
StrCopy(PChar(Str2), PChar(Str1));
 
好像叫什么“写时复制”
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
606
import
I
后退
顶部