Текущий архив: 2004.06.13;
Скачать: CL | DM;
Внизпервое вхождение подстроки без применения POS Найти похожие ветки
← →
lamer (2004-05-27 16:27) [0]помогите plz. как правильно реализовать поиск первого вхождения подстроки в строку без применения функции POS
← →
WebErr © (2004-05-27 16:28) [1]Удалено модератором
← →
panov © (2004-05-27 16:52) [2]for .. to ... do
begin
end;
← →
VMcL © (2004-05-27 17:13) [3]>>lamer (27.05.04 16:27)
function FindSubStr(const SubStr: AnsiString; const S: AnsiString): Integer; register;
asm
{ ->EAX Pointer to SubStr }
{ EDX Pointer to S }
{ <-EAX Position of substr in s or 0 }
TEST EAX,EAX
JE @@noWork
TEST EDX,EDX
JE @@stringEmpty
PUSH EBX
PUSH ESI
PUSH EDI
MOV ESI,EAX { Point ESI to substr }
MOV EDI,EDX { Point EDI to s }
MOV ECX,[EDI-skew].StrRec.length { ECX = Length(s) }
PUSH EDI { remember s position to calculate index }
MOV EDX,[ESI-skew].StrRec.length { EDX = Length(substr) }
DEC EDX { EDX = Length(substr) - 1 }
JS @@fail { < 0 ? return 0 }
MOV AL,[ESI] { AL = first char of substr }
INC ESI { Point ESI to 2"nd char of substr }
SUB ECX,EDX { #positions in s to look at }
{ = Length(s) - Length(substr) + 1 }
JLE @@fail
@@loop:
REPNE SCASB
JNE @@fail
MOV EBX,ECX { save outer loop counter }
PUSH ESI { save outer loop substr pointer }
PUSH EDI { save outer loop s pointer }
MOV ECX,EDX
REPE CMPSB
POP EDI { restore outer loop s pointer }
POP ESI { restore outer loop substr pointer }
JE @@found
MOV ECX,EBX { restore outer loop counter }
JMP @@loop
@@fail:
POP EDX { get rid of saved s pointer }
XOR EAX,EAX
JMP @@exit
@@stringEmpty:
XOR EAX,EAX
JMP @@noWork
@@found:
POP EDX { restore pointer to first char of s }
MOV EAX,EDI { EDI points of char after match }
SUB EAX,EDX { the difference is the correct index }
@@exit:
POP EDI
POP ESI
POP EBX
@@noWork:
end;
← →
Anatoly Podgoretsky © (2004-05-27 17:45) [4]AnsiPos
← →
Aldor © (2004-05-27 18:48) [5]Если охота выпендриться, можно реализовать алгоритмы Рабина-Карпа или Кнута-Морриса-Пратта
← →
SammIk © (2004-05-27 20:07) [6]А чам тебе поз не нравится?
← →
MetalFan (2004-05-27 20:53) [7]
> VMcL © (27.05.04 17:13) [3]
крут! скопировал из system )))
← →
VMcL © (2004-05-28 15:03) [8]>>MetalFan (27.05.04 20:53) [7]
угу :)
← →
WebErr © (2004-05-28 15:56) [9]Много шума из ничего...
← →
lyeh © (2004-05-29 03:47) [10]А чем все таки Pos не нравится???
← →
TUser © (2004-05-29 08:08) [11]
> А чем все таки Pos не нравится???
Сессия, наверное ...
← →
begin...end © (2004-05-29 11:31) [12]
function MyPos(SubStr, Str: String): Integer;
begin
Result := Pos(SubStr, Str);
end;
:-)
← →
begin...end © (2004-05-29 11:33) [13]
function MyPos(SubStr, Str: String): Integer;
var
I, J, K, L1, L2: Integer;
Found: Boolean;
begin
L1 := Length(Str);
L2 := Length(SubStr);
Result := 0;
if (L1 = 0) or (L2 = 0) or (L2 > L1) then Exit;
Found := False;
I := 1;
repeat
J := I;
K := 1;
while (Str[J] = SubStr[K]) do
begin
Inc(J);
Inc(K);
if K > L2 then Break;
end;
Found := K > L2;
Inc(I);
until (I > L1 - L2 + 1) or Found;
if Found then Result := I - 1;
end;
P.S. Этот код является наглядной иллюстрацией моего корявого алгоритмического мышления.
:-)
← →
Gero © (2004-05-29 11:44) [14]
function MyPos(Sub, S : string) : Integer;
var
i : Integer;
begin
Result := 0;
for i := 1 to Length(S) do
if Copy(S, i, Length(Sub)) = Sub then
begin
Result := i;
Break;
end;
end;
P.S. Не проверял.
← →
begin...end © (2004-05-29 12:17) [15]> Gero © (29.05.04 11:44) [14]
for i := 1 to Length(S) do
Нехорошо, ИМХО.
Но в целом всё же лучше, чем у меня.
Я почему то решил, что вообще никакими строковыми функциями нельзя пользоваться.
← →
Gero © (2004-05-29 12:19) [16]
> for i := 1 to Length(S) do
>
> Нехорошо, ИМХО.
for i :=1 to S[0] do :)
← →
begin...end © (2004-05-29 12:42) [17]
> Gero © (29.05.04 12:19) [16]
Я не про то.
Если длина строки, скажем - 10 символов, длина подстроки - 5 символов, а i = 8, то смысла копировать по сути дела 3 символа нету, ИМХО.
← →
Gero © (2004-05-29 12:55) [18]
> begin...end © (29.05.04 12:42)
Да, Вы правы, просто я не сильно-то задумывался об эффективности при написании этого кода.
Хорошо,for i := 1 to Length(S) - Length(Str) + 1 do
подойдет?
← →
begin...end © (2004-05-29 13:32) [19]
> Gero © (29.05.04 12:55) [18]
Ну да, это я и имел в виду.
Подойти должно не мне, а автору топика :)))
← →
Anatoly Podgoretsky © (2004-05-29 14:05) [20]begin...end © (29.05.04 13:32) [19]
А это не факт, он молчит. По вопросу подойдет любая функция или решение, лишь бы это было не Pos, вне зависимости от того, почему он ее ненавидит.
← →
Глеб © (2004-05-29 14:07) [21]А почему pos нельзя использовать? 8>)
← →
lyeh © (2004-05-31 00:45) [22]Крому Pos есть (насколько помню) еще и AnsiPos, и StrPos
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.027 c