看似简单的问题:array of char(动态array) 转换为string的方法(7分)

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

tianzhen

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.FormCreate(Sender: TObject);
var
mychar:array of char;
tmp:tstringlist;

begin
setlength(mychar,1);
mychar[0]:='t';
tmp:=tstringlist.create;
tmp.Add(mychar); //Incompatible types: 'string' and 'dynamic array'
showmessage(tmp.Strings[0]);
end;


用tmp.Add(string(mychar)); 结果错误,因为string的下标从1开始
 
tmp.Add(mychar);
换成
for i:=0 to high(mychar) do
tmp.add(mychar);
 
真的需要这么麻烦啊
 
好像只能写for循环.我也是这么干的.单独写函数啊.累.
 
tmp.Add(PChar(mychar[0]));
or
tmp.Add(StrPas(mychar));
 
用StrPos函数。
 
tmp.Add(StrPas(mychar));
[Error] Unit1.pas(34): E2010 Incompatible types: 'Array' and 'Char'

tmp.Add(PChar(mychar[0])); 有非法内存访问
 
StrPos 函数 返回一个字符串在另一个字符串中首次出现指针
好像没用吧?
 
楼主,应该这么写:tmp.Add(StrPas(@mychar));
 
tmp.Add(PChar(mychar[0]));
 
tmp.Add(StrPas(@mychar)); //结果不对 是个?
 
帮您看看。。。
 
用tmp.Add(string(mychar)); 结果不确定,我这里是ta
 
现在唯一正确的是tmp.Add(Copy(PChar(@mychar[0]), 1, Length(mychar)));

有些烦琐
 
procedure TForm1.Button1Click(Sender: TObject);
var
Len: Integer;
mychar: array of Char;
s: string;
begin
Len := 1;
SetLength(mychar, Len);
mychar[0] := 'a';

//根本用不着 TStringList,下面两句话解决问题
s := PChar(mychar);
SetLength(s, Len);

showmessage(s);
end;
 
用TStringList是因为char要add到TStringList中,不是为了中转
你的方法等价于
tmp.Add(Copy(PChar(mychar), 1, Length(mychar)));
 
看来一定是得这么烦琐了
 
用这个函数:

function chartostring(Buf:pchar;length:integer):string;//char转变成string
var
s:string;
begin
setlength(s,length);
move(Buf[0],s[1],length); //不能用strcopy
result:=s;
end;
 
var
mychar:array of char;
tmp:tstringlist;

begin
setlength(mychar,2); //把1改成2
mychar[0]:='t';
tmp:=tstringlist.create;
tmp.Add(string(mychar));
showmessage(tmp.Strings[0]);

end;
 
楼上的方法居然好用,什么道理
 
后退
顶部