这样把字符数组转换成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;

解决方案 »

  1.   

     s := vp; 可以直接赋值的
      

  2.   


    正确的。
    如果是动态数组,则需要以#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; 
      

  3.   

    楼主,这个问题你完全可以自己在delphi下测试。
      

  4.   

    StrPCopy(vp,'test');
    ShowMessage(vp); 
      

  5.   


    jadeluo 老师能否解释一下为什么静态数组不用#0结束,而动态数组必须得用#0结尾的原因吗
      

  6.   

    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';     setlength (s,sizeof(vp));
        CopyMemory(@s[1],vp,sizeof(vp));
     
                               
      ShowMessage(s); 
    end; 
      

  7.   


    静态数组时:
      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作为结束符。