Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.026 c
3-1085157912
Igor_P
2004-05-21 20:45
2004.06.13
автоинкремент в Interbase


1-1085778134
Ruslan
2004-05-29 01:02
2004.06.13
Как поместить картинку на ToolButton?


4-1083416802
Hawk
2004-05-01 17:06
2004.06.13
Перехват сообщения из окна чужого приложения


14-1085420205
Мазут Береговой
2004-05-24 21:36
2004.06.13
Новые вирусы... может я отстаю от жизни...


3-1085222354
Damager
2004-05-22 14:39
2004.06.13
Автоинкрементное поле