这样把字符数组转换成string正确吗?
procedure TForm1.Button1Click(Sender: TObject);
var
vp: array[0..3] of Char;
s: string;
begin
VP[0] := 't';
VP[1] := 'e';
VP[2] := 's';
VP[3] := 't'; s := string(vp);
ShowMessage(s);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
vp: array[0..3] of Char;
s: string;
begin
VP[0] := 't';
VP[1] := 'e';
VP[2] := 's';
VP[3] := 't'; s := string(vp);
ShowMessage(s);
end;
解决方案 »
- 请教高手们,加载窗体时使用多线程显示进度的问题!
- TStringGrid如何只固定某一列
- 扩展存储过程返回值的问题
- 请教:从exe给dll传递一个adoquery参数,报invalide pointer 错误,怎么解决?
- 请高手解决棘手老问题 《tif文件合并和分割问题》在线等待。。。急急急(分不够可再开贴加)
- 高分求教! 为什么字段得值是123.50,而在DBGRID里显示出来的是123.5,少了一位小数啊!
- 如何使BitBtn上加载的图像自适应BitBtn的大小。用speedbutton也行。在线
- 将程序做成Service形式,用TService实现,如何做呢
- 如何自动登录数据库,我查了以前的帖子,还是不行
- 我有一个数据库是PARADOX的,存储的一个TD字段,是TIMESTAMP类型!怎样根据数据库的这个字段为图片命名!
- 用dbExpress连接MYSQL时出错 提示:unable to load dbexpmy4.dll
- fastReport 3.0的问题
正确的。
如果是动态数组,则需要以#0字符作为字符串的结尾。例如:procedure TForm1.Button1Click(Sender: TObject);
var
vp: array of Char;
s : string;
begin
SetLength(vp, 5);
VP[0] := 't';
VP[1] := 'e';
VP[2] := 's';
VP[3] := 't';
VP[4] := #0;
s := string(vp); //这里,不能简写成 s := vp 了
ShowMessage(s);
end;
ShowMessage(vp);
jadeluo 老师能否解释一下为什么静态数组不用#0结束,而动态数组必须得用#0结尾的原因吗
var
vp: array[0..3] of Char;
s: string;
begin
VP[0] := 't';
VP[1] := 'e';
VP[2] := 's';
VP[3] := 't'; setlength (s,sizeof(vp));
CopyMemory(@s[1],vp,sizeof(vp));
ShowMessage(s);
end;
静态数组时:
s := String(vp);
或者
s := vp; (完全等价于前者, 只是把强制类型转换的String给省略了, 编译出的代码与前者是一样的) 所对应的编译结果是这样的:
lea eax,[s]
lea edx,[vp]
mov ecx, 4 //4就是vp数组的大小
call @LStrFromArray
LStrFromArray是根据ecx内的值来确定字符数组的结束位置的,这样的代码是能正确运行的。
动态数组时:
s := String(vp);
所对应的编译结果是这样的:
lea eax, [s]
mov edx, [vp]
call @LStrAsg
LStrAsg是根据字符数组中的#0来确定结束位置的,所以vp数组中必须要以#0作为结束符。