function get_divide_str(s:string; no: integer; c:Char): string;
var
  len, start, found_n: integer;    
begin
  len := length(s);
  found_n := 0;  //找到包含分割符的开始点-->start
  start := 0;
  while (found_n < no - 1) do
  begin
    inc(start) ;
    if start > len then start := len;
    if (s[start] = c) or (start = len) then inc(found_n);
  end;  //准备取字符串的起点
  result := '';
  inc(start);
  //     if start>len then start:=len;  while (start <= len) and not (s[start] = c) do
  begin
    result := result + s[start];
    inc(start);
  end;
  ;
  result := trim(result);
end;
通过以上函数可以实现以下目的s:='中国'+'|'+'美国'+'|'+'日本'showmessage(get_divide_str(s,1,'|'));显示:"中国" 。   如果是2就显示"美国"是3就显示"日本"但是如果将  '|'  单竖 改成 '||' 就不行了要怎么改才能达到上面的效果也就是{s:='中国'+'||'+'美国'+'||'+'日本'showmessage(get_divide_str(s,1,'|'));显示:"中国"如果是2就显示"美国"是3就显示"日本"   }
请高手指点。。急....................

解决方案 »

  1.   


    class function TStringData.MyPos(Sub,Sour:String;IgnoreCase:boolean):integer;
    begin
      if IgnoreCase then result:=TStringData.MyPosEx(Sub,Sour,1,true)
      else result:=Pos(Sub,Sour);
    end;class function TStringData.MyPosEx(Sub,Sour:String;Offset:integer;IgnoreCase:boolean):integer;
    var
      S,D:PChar;
      Size1,Size2:integer;
    begin
      if IgnoreCase then
      begin
        Size1:=Length(Sub);
        Size2:=Length(Sour);    if (Offset<1) or (Offset>Size2) or (Size1>Size2) or (Size1=0) then result:=0
        else
        begin
          S:=PChar(Sour);
          D:=PChar(Sub);      for result:=Offset to Size2 do if SamePChar(S+result-1,D,Size1,true) then break;      if result>Size2 then result:=0;
        end;
      end
      else result:=PosEx(Sub,Sour,Offset);
    end;class function TStringData.SplitString(Data,Split:String;IgnoreCase,CanEmpty:boolean):TStrings;
    var
      Item:String;
      Size1,Size2,Offset1,Offset2:integer;
    begin
      result:=nil;  Offset1:=1;  Size1:=Length(Data);
      Size2:=Length(Split);  repeat
        Offset2:=TStringData.MyPosEx(Split,Data,Offset1,IgnoreCase);    if (Offset2=0) and (Offset1<=Size1) then Offset2:=Size1+1;    if Offset2>0 then
        begin
          if Offset2>1 then //不能是第一个分隔符
          begin
            Item:=MidBStr(Data,Offset1,Offset2-Offset1);        if CanEmpty or (Item<>'') then
            begin
              if result=nil then result:=TStringList.Create;          result.Add(Item);
            end;
          end;      Offset1:=Offset2+Size2;
        end;
      until Offset2=0;
    end;
      

  2.   

    willflyz  你好。。感谢你们的回复。。好像不行提示出错
    function get_divide_str(s:string; no: integer; subS:String): string;overload;
    var
      sNew: string;
    const
      c = '|';
    begin
      sNew := StringReplace(s,subs,c,[rfReplaceAll]);
      Result := get_divide_str(sNew,no,c);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      s,s1:string;
    begin
      s:='中国'+'||'+'美国'+'||'+'日本';
      s1:=get_divide_str(s,2,'||');
      showmessage(s1);
    end;
      

  3.   

    提示什么错误,函数后面加overload,我在自己电脑测试过了,没有问题的,因为你本来的函数就可以了.
      

  4.   

      //找到包含分割符的开始点-->start
      start := 0;
      while (found_n < no - 1) do
      begin
        inc(start) ;
        if start > len then start := len;
        if (s[start] = c) or (start = len) then
        begin
          inc(found_n);
          if s[start+1] = c then
            found_n := found_n -1 ;
        end;

      end;
      

  5.   

    willflyz  你好。。你看所有的代码是不是这样?function get_divide_str(s:string; no: integer; subS:String): string;overload; 
    var
      sNew: string;
    const
      c = '|';
    begin
      sNew := StringReplace(s,subs,c,[rfReplaceAll]);
      Result := get_divide_str(sNew,no,c);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      s,s1:string;
    begin
      s:='中国'+'||'+'美国'+'||'+'日本';
      s1:=get_divide_str(s,2,'||');
      showmessage(s1);end;提示:"stack overflow"
      

  6.   

    willflyz  你好。。  感谢可以了。。是我才没有做来
      

  7.   

    function get_divide_str(s:string; no: integer; c:Char): string; 
    var
      i:integer;  
    begin
      if pos(c,s)=0 then  //s中没有子串c
      begin
        if no=1 then
          result:=s
        else
          result:='';
        exit;
      end;
      
      if no=1 then
        result:=copy(s,1,pos(c,s)-1)  
      else
      begin
        i:=1;
        while i<no do
        begin
          s:=copy(s,pos(c,s)+1,length(s));
          while (length(s)>=1) and (s[1]=c) do
            s:=copy(s,2,length(s));
          inc(i);
        end;
        if pos(c,s)=0 then
          result:=s
        else
          result:=copy(s,1,pos(c,s)-1);
      end;
    end;test it yourself