输入一串汉字和字母的混合串,例如:‘在三角形ABC中’,我要得到‘在\三角形\ABC\中’。
写了几个函数,运行结果就是不对。
Function TSegmentForm.HHStrSever(StrTo:String):String;
var
StrOut,Str:String;
i,j:integer;
begin
StrOut:='';
while Length(StrTo)<>0 do
begin
i:=0;
if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
begin
i:=1;
while (i<Length(StrTo)) and ((StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z'])) do
inc(i);
StrOut:=StrOut+LeftBStr(StrTo,i)+'\';
StrTo:=RightBStr(StrTo,Length(StrTo)-i);
end
else
begin
j:=0;
while (j<Length(StrTo)) and not ((StrTo[j] in ['a'..'z']) or (StrTo[j] in ['A'..'Z'])) do //È¡³öÁ¬ÐøµÄÒ»´®ºº×Ö
j:=j+2;
StrOut:=StrOut+HZStrSever(LeftBStr(StrTo,j));
StrTo:=RightBStr(StrTo,Length(StrTo)-j);
end;
end;
HHStrSever:=StrOut;
end;
Function TSegmentForm.HZStrSever(StrTo:String):String;
var
StrOut,StrTmp:String;
Len:Integer;
begin
StrOut:='';
while Length(StrTo)<>0 do
begin
Len:=Length(StrTo);
if Len>16 then Len:=16;
StrTmp:=LeftBStr(StrTo,Len);
while (Len>2) and (not isFound(StrTmp)) do
begin
Len:=Len-2;
StrTmp:=LeftBStr(StrTmp,Len);
end; StrOut:=StrOut+StrTmp+'\';
StrTo:=RightBStr(StrTo,Length(StrTo)-Length(StrTmp));
end;
HZStrSever:=StrOut;
end;
Function TSegmentForm.isFound(StrTo:String):Boolean;
begin
with Table1 do
begin
if Active then Close;
Open;
if Locate('WORDNAME',StrTo,[]) then isFound:=True
else isFound:=False;
end;
end;其中,后面两个函数HZStrSever和isFound我觉得没问题,就是第一个函数调用老得不到想要的结果。你帮帮我啦。
写了几个函数,运行结果就是不对。
Function TSegmentForm.HHStrSever(StrTo:String):String;
var
StrOut,Str:String;
i,j:integer;
begin
StrOut:='';
while Length(StrTo)<>0 do
begin
i:=0;
if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
begin
i:=1;
while (i<Length(StrTo)) and ((StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z'])) do
inc(i);
StrOut:=StrOut+LeftBStr(StrTo,i)+'\';
StrTo:=RightBStr(StrTo,Length(StrTo)-i);
end
else
begin
j:=0;
while (j<Length(StrTo)) and not ((StrTo[j] in ['a'..'z']) or (StrTo[j] in ['A'..'Z'])) do //È¡³öÁ¬ÐøµÄÒ»´®ºº×Ö
j:=j+2;
StrOut:=StrOut+HZStrSever(LeftBStr(StrTo,j));
StrTo:=RightBStr(StrTo,Length(StrTo)-j);
end;
end;
HHStrSever:=StrOut;
end;
Function TSegmentForm.HZStrSever(StrTo:String):String;
var
StrOut,StrTmp:String;
Len:Integer;
begin
StrOut:='';
while Length(StrTo)<>0 do
begin
Len:=Length(StrTo);
if Len>16 then Len:=16;
StrTmp:=LeftBStr(StrTo,Len);
while (Len>2) and (not isFound(StrTmp)) do
begin
Len:=Len-2;
StrTmp:=LeftBStr(StrTmp,Len);
end; StrOut:=StrOut+StrTmp+'\';
StrTo:=RightBStr(StrTo,Length(StrTo)-Length(StrTmp));
end;
HZStrSever:=StrOut;
end;
Function TSegmentForm.isFound(StrTo:String):Boolean;
begin
with Table1 do
begin
if Active then Close;
Open;
if Locate('WORDNAME',StrTo,[]) then isFound:=True
else isFound:=False;
end;
end;其中,后面两个函数HZStrSever和isFound我觉得没问题,就是第一个函数调用老得不到想要的结果。你帮帮我啦。
解决方案 »
- 关于delphi编写dll的问题
- delphil 中事务问题,急、急、急!
- 关于获取目录下所有文件名的问题。。
- 哦买嘎的!打开工程Delphi就关闭!
- 这样的动作应该在哪个事件过程中处理?
- Delphi怎么获取主板/CPU/显卡温度及相应风扇转速
- 多线程阻塞式 Socket ,服务器端如何把在某一个线程中接受到来的信息,再发送给其它线程呢?
- 怎樣讓MDIchildform初始時不顯示????
- 寻求再好的类库接口继承方案
- 谁能回答这个问题,我出原贴(100分)+新贴(300分)共400分!
- 请教各位大侠,如果表中的索引是varchar2类型的,是不是会出一些问题
- ******请问如何使用https协议进行通讯?******
1. 汉字。按照最大匹配法,先取预先设定长度的字符串,在数据表中查找该字符串,如果找到,就在该字符串的尾部加上分隔符;如没找到,就从该取出字符串的尾部减去两个字节,继续在数据表中找......(见HZStrSever函数)2.字母。取出连续的字母序列后在尾部加上分隔符。我讲清楚了吗?
\应该说是没有规律的吧。to GoldShield(小花☆正直人)
不是只针对我举的这个例子。谢谢大家了,帮帮我吧。分不够还可以再加。
function TSegmentForm.HHStrSever(StrTo: String): String;
var
StrOut:String;
i,j:integer;
begin
StrOut:='';
while Length(StrTo)>0 do
begin
i:=1;
if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
begin
i:=1;
while (i<Length(StrTo)) and ((StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z'])) do
begin
if Ord(StrTo[i+1]) > 127 then Break;
inc(i);
end;
StrOut:=StrOut+LeftBStr(StrTo,i)+'\';
StrTo:=RightBStr(StrTo,Length(StrTo)-i);
end
else
begin
j:=0;
while (j<Length(StrTo)) and not ((StrTo[j] in ['a'..'z']) or (StrTo[j] in ['A'..'Z'])) do //È¡³öÁ¬ÐøµÄÒ»´®ºº×Ö
begin
if Ord(StrTo[j+1]) <= 127 then Break;
j:=j+2;
end;
StrOut:=StrOut+HZStrSever(LeftBStr(StrTo,j));
StrTo:=RightBStr(StrTo,Length(StrTo)-j);
end;
end;
if StrOut[Length(StrOut)] = '\' then StrOut := LeftBStr(StrOut, Length(StrOut)-1);
HHStrSever:=StrOut;
end;
1.HHStrSever函数里面的var Str:string在该函数中自始至终都没有使用过。
2.在HHStrServer函数里面的条件语句
if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
else
这个if..else的关系,是否存在着“不是A,就是B”的关系呢?如果存在“不是A,有可能是B,也有可能是C”的关系的话,那么我个人认为,这个条件语句就值得琢磨琢磨。
好像可以了,有几个问题请教:
1.while Length(StrTo)<>0 do
begin
i:=0;
if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
begin...... 你将i:=0改成i:=1原因是啥?2.你代码中if Ord(StrTo[i+1]) > 127 then Break;意思是如果后一个字节不是字母了,那么就跳出循环体;而if Ord(StrTo[j+1]) <= 127 then Break; 就是当后一个不是汉字的时候跳出?3. 这个127是啥意思?4.最后if StrOut[Length(StrOut)] = '\' then StrOut := LeftBStr(StrOut, Length(StrOut)-1);
这里你设置的条件有可能发生吗?