一个函数的问题。。试了多次都不行不知何帮,请高手指点。FUNCTION 就急..............................................................
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就显示"日本" }
请高手指点。。急....................
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就显示"日本" }
请高手指点。。急....................
解决方案 »
- 登陆窗口时,怎么会出现声音?
- 谁有类似PageControl的美化控件?(象Maxthon或VS.NET那样的)
- 如何把一个excel或word等文件保存到oracle7.3中,并可以把它读出并用excel或word程序打开.(用DELPHI开发)
- 如何在文件里搜索字符串,并将该字符串前的所有byte(包括各种控制符号,如回车,换行符)读入内存?
- 关于 update table set num=1 的SQL语句在DELPHI里ADOQuery1 的使用问题
- 不对啊?
- 请大家急救:在使用ADO连接时成功,但其后无论用哪个ADO控件都出现'FROM 子句错误' ,请问如何解决???
- delphi 的判断语句问题?
- 三层问题!你知我不知!高手指教!
- case when end 的字段,怎么在DBGridEH变成灰色背景
- idhttp登陆淘宝问题
- DBEdit的EditMask属性使用问题
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;
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;
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;
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"
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