关于pos,length函数和pchar类型的使用问题
在我的一段代码中具体情况如下:
var
 receive : pchar;
 ...
begin
  ...
  receive := somefunction(...);
  if pos('error',receive) > 0 then 
     begin
       Result := receive;
       exit;
     end;
  ....end;在使用pos函数后我发现pchar变量receive的数据被部分丢弃....在同样的位置我使用length(receive)函数来处理receive的长度可以得到其准确的长度80但是使用length()之后pchar变量出现相同的问题...()

解决方案 »

  1.   

    receive : pchar;
    str: string;
    begin
     str := strpas(receive);这样再操作
      

  2.   

    receive 返回数据如下
    '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000'#0
    在使用strpas()后
    var
    receive : pchar;
    my_receive : string;
    ...
    begin
       ...
       my_receive := strpas(receive)
       ...
    end;receive 的数据变为:'0000000001010000'#0
    myreceive的数据变为:'52455354ADBAACAB60F91700F8EBFD7F0000000001010000'#0#0'F81700020000000200000000000000'?????
      

  3.   

    检查其它代码,或者实际用showMessage 检查看看
      

  4.   

    能不能给一段能调试的代码,这样问谁帮得了你?提示:
    PChar是以#0结尾的,如果字符串内容中包含了#0,那么“数据被部分丢弃”就有可能了
    建议将内容的长度一并打包处理
      

  5.   

    var
     receive : pchar;
     rec1:string;
     ...
    begin
      ...
      receive := somefunction(...);
      rec1:=receive;
      if pos('error',rec1) > 0 then 
         begin
           Result := pchar(rec1);
           exit;
         end;
      ....end;
      

  6.   

    在返回的pchar中D8这2个字符被#0#0替换了....
    在模拟一个错误的环境等下发上来
      

  7.   

    to  mezw(灵珠子)   行不通
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: pchar;
      T: String;
    begin
      S := '52455354AD'+#0+
           'BAACAB60F9
            1700F8EBFD
            7F0000'+#0+'000
            001010000D
            8F81700020
            0000002000
            0000000000
            0' + #0;
    //  T := inttostr(strlen(S));
      SetLength(T,83);
      Move( S^, PChar(T)^,83);end;
      

  9.   

    如果接受到的数据里面有#0的话,最好就不用PChar了吧,不然的话,它会自己截断的。我看你的程序好像是做通信用吧,直接用个很大的buff:array[1..maxlength] of char;
    来接受不就行了.
      

  10.   

    unit Uni_Pchar;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      Tfrm_pchar = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frm_pchar: Tfrm_pchar;
     Function ReadCom:Pchar;implementation{$R *.dfm}procedure Tfrm_pchar.Button1Click(Sender: TObject);
    Var
       //{$T-}
       my_Pchar : Pchar;
       //{$T+}
       m_data : array[0..3]of char;
       str : string;
    begin
      my_Pchar := ReadCom;
      If pos('error',my_Pchar) > 0 then
        begin
          showmessage(my_Pchar);
        end;
      showmessage(my_Pchar);end;
    Function ReadCom:Pchar;
    Var
    str,str_tmp : string;
    I : Integer;
    Begin
      str := '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000';
      For I := 1 to length(str) do
        str_tmp := str_tmp + str[I];
      Result := pchar(str_tmp);
    end;end.
      

  11.   

    pos的参数只能是string,而你总是pos 一个pchar,;肯定不对了。
    你将pchar转换为string后再pos
      

  12.   

    典型的内存问题:
    procedure Tfrm_pchar.Button1Click(Sender: TObject);
    Var
       //{$T-}
       my_Pchar : Pchar;
       //{$T+}
       m_data : array[0..3]of char;
       str : string;
    begin
      my_Pchar := ReadCom;  //这里得到的指针指向的数据已经释放了,但由于这块数据并没有被清空或者覆盖,运气好的话还是可以访问到刚才写入的数据,呵呵。  If pos('error',my_Pchar) > 0 then
        begin
          showmessage(my_Pchar);
        end;//执行了部分代码后,这块自由内存可能发生了变化,再拿着指针去访问,数据自然也就不对了
      showmessage(my_Pchar);end;
    Function ReadCom:Pchar;
    Var
    str,str_tmp : string;
    I : Integer;
    Begin
      str := '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000';
      For I := 1 to length(str) do
        str_tmp := str_tmp + str[I];  Result := pchar(str_tmp); //实际返回的就是str_tmp的指针,str_tmp是个临时变量,函数结束后随之释放了。
    end;end.
      

  13.   

    unit Unit1;
    interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      Tfrm_pchar = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frm_pchar: Tfrm_pchar;
     
    implementation{$R *.dfm}
    Procedure ReadCom(Var aPChar: PChar);
    Var
      Str, Str_tmp: string;
      I : Integer;
    Begin
      Str := '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000';
     // SetLength(Str_tmp, Length(Str));
      For I := 1 to Length(Str) do
        Str_tmp := Str_tmp + Str[I];
      CopyMemory(aPChar, Pointer(Str_Tmp), Length(Str_Tmp));
    end;
    procedure Tfrm_pchar.Button1Click(Sender: TObject);
    Var
      my_Pchar: Pchar;
      m_data: array[0..3]of char;
    begin
      my_PChar:= AllocMem(255);  ReadCom(my_Pchar);  If Pos('error', my_Pchar) > 0 then
      begin
        showmessage(my_Pchar);
      end;  ShowMessage(my_Pchar);  FreeMem(my_PChar);
    end;end.
      

  14.   

    //同意,hero_yin(阿鬼)所说://实际返回的就是str_tmp的指针,str_tmp是个临时变量,函数结束后随之释放了。function ReadCom: PChar;
    var
      str, str_tmp: string;
      I : Integer;
    Begin
      str := '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000';
      str_tmp := ''; //初始化
      for I := 1 to Length(str) do
        str_tmp := str_tmp + str[I];
      GetMem(Result, Length(str_tmp) + 1); //分配空间
      StrPCopy(Result, str_tmp);
      Result[Length(str_tmp)] := #0;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
       my_Pchar : Pchar;
       m_data : array[0..3]of char;
       str: string;
    begin
      my_Pchar := ReadCom;
      If pos('error',my_Pchar) > 0 then
        begin
          showmessage(my_Pchar);
        end;
      ShowMessage(my_Pchar);
      FreeMem(my_Pchar, StrLen(my_Pchar) + 1); //释放空间
    end;