Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

первое вхождение подстроки без применения 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.071 c
3-1085419004
Duch
2004-05-24 21:16
2004.06.13
При запуске не находит базу данных


3-1085032891
Alex_x
2004-05-20 10:01
2004.06.13
технология доступа в MIDAS?


3-1084972238
ka
2004-05-19 17:10
2004.06.13
Транзакции


1-1085994920
DBDEV
2004-05-31 13:15
2004.06.13
TTreeView->MultiSelect - помогите написать обработчик.


8-1081147608
Ozone
2004-04-05 10:46
2004.06.13
Canvas - > JPEG





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский