使用Pchar类型的问题:
pchar类型变量之间怎么赋值阿?
也即是说使用了strpos(str1,str2)函数之后,会返回一个pchar指针。Returns a pointer to the first occurrence of STR2 in STR1.
然后我想要从返回的这个指针的位置开始再向后面搜索同样的str2。那么我应该怎么做阿?

解决方案 »

  1.   

    str3 := StrPos(str1, str2);
    Inc(str3);  // +1
    str3 := StrPos(str3, str2);  // 再向后搜索
      

  2.   

    循环:
    str3 := StrPos(str1, str2);
    while str3 <> nil do begin
      ShowMessage(str3);
      Inc(str3);
      str3 := StrPos(str3, str2);
    end;
      

  3.   

    那么str3是否需要进行初始化。例如getmem()?gemem()函数是不是这样写的:getmem(str2,sizeof(str1))?
      

  4.   

    不用初始化,你可以把str3看成指向str1内容的指针,向后移动搜索。
      

  5.   

    我刚才测试了一下,可是怎么样得到的都是为空指针阿?
    而且还说是"非法存取"。
    procedure TForm1.FormCreate(Sender: TObject);
    var
    str1,str2,str3:pchar;
    begin
    str2:= pchar('www.csdn.com');
    str1:= pchar('.');str3 := StrPos(str1, str2);
    while str3 <> nil do begin
      ShowMessage(str3);
      Inc(str3);
      str3 := StrPos(str3, str2);
    end;
      

  6.   

    StrPos的参数顺序颠倒了,后面的参数才是要搜索的字符串,StrPos(str2, str1)
    procedure TForm1.FormCreate(Sender: TObject);
    var
    str1,str2,str3:pchar;
    begin
    str2:= 'www.csdn.com';  // 直接指向字符串,不要用pchar(...)
    str1:= '.';str3 := StrPos(str2, str1);
    while str3 <> nil do begin
      ShowMessage(str3);
      Inc(str3);
      str3 := StrPos(str3, str1);
    end;
      

  7.   

    好像错误在??处
    while str3 <> nil do begin
      ShowMessage(str3);
      Inc(str3);
      str3 := StrPos(str3, str2);??
    end;
    你试一试在Inc(str3)之后,看一看str3的值,即str3^是什么?
    呵呵,知道错误了吧。
      

  8.   

    谢谢sysu,
    那么该如何取得用'.'分割开的第N个字符串呢?
    返回结果也是pchar类型时的情况。我的想法是当知道了第N-1个'.'的位置,然后又知道了第N个点的位置,
    那么就可以截取中间的字符串出来拉。但是具体应该怎么写法呢。如果是在delphi环境中就很简单了,但是在可以被其他程序共享的DLL中
    我确实是被指针搞到昏掉了。刚学delphi,就碰上这种任务,惨呐!!!
      

  9.   

    一个不成文的原则是:内存在哪里申请,在哪里释放.看看win32 api 的设计就知道了.如果返回pchar的话,除非是你自己模块内部的函数,不给别人调用的,否则使用你这个函数的人很难明白该什么时候去释放这块内存.不过参数形式可以是:
    procedure(const buff :PChar,const bufflen:Word)
    多加一个bufflen参数,供函数内部做验证用.
      

  10.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
    str1,str2,str3,str4,str:pchar;
    i, n: Integer;
    begin
    str2:= 'www.csdn.com';
    str1:= '.';i := 0;
    n := 2;  // 查找第n个
    str4 := str2;
    str3 := StrPos(str2, str1);
    str := nil;
    while str3 <> nil do begin
      Inc(i);
      if i = n then begin
        str := AllocMem(Integer(str3)-Integer(str4)+1);
        StrLCopy(str, str4, Integer(str3)-Integer(str4));
        Break;
      end;
      Inc(str3);
      str4 := str3;
      str3 := StrPos(str3, str1);
    end;
    if str = nil then begin
      str := AllocMem(StrLen(str4)+1);
      StrCopy(str, str4);
    end;
    ShowMessage(str);
    FreeMem(str);
    end;
      

  11.   

    感激到痛哭流涕阿
    期限就要到了,终于找到了方向。
    sysu的例子让我知道了应该怎么使用pchar。
    其他的函数也可以开始进行编写了。