Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2011, 23:10   #1
Mister.V
 
Аватар для Mister.V
 
Регистрация: 14.12.2011
Сообщений: 7
По умолчанию Поиск подстроки в строке

Нужен рабочий алгоритм для оболочки PascalABC.Net нахождения подстроки в строке.
Функцию pos(sub,s:string):integer; можете не предлагать (в абц она есть и она работает, но не правильно, в общем из-за этой функции два вечера убил)
Нужен аналог функции pos (лучше всего его копию). Спасибо

PS. Если вы можете подсказать метод, который удалит из строки все повторения подстроки, то буду совсем счастлив ))

Последний раз редактировалось Mister.V; 14.12.2011 в 23:15.
Mister.V вне форума Ответить с цитированием
Старый 14.12.2011, 23:12   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

В чем неправильность работы Pos?
Arigato вне форума Ответить с цитированием
Старый 14.12.2011, 23:21   #3
Mister.V
 
Аватар для Mister.V
 
Регистрация: 14.12.2011
Сообщений: 7
По умолчанию

В ходе выполнения цикла начиная где-то с 6 итерации функция l:=length(st) (st-подстрока) начинает принимать страшные величины (от 500000 до 8000000 и более), а сам st отказывается выводится на экран (writeln(st)). При том, что если удалить цикл с функцией pos (второй цикл, внутри основного), то всё отображается корректно.
Mister.V вне форума Ответить с цитированием
Старый 14.12.2011, 23:23   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может дело не в функции pos, а в вашем цикле?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.12.2011, 23:26   #5
Mister.V
 
Аватар для Mister.V
 
Регистрация: 14.12.2011
Сообщений: 7
По умолчанию

Код:
constructor WordsOUT.Create(BD:spisok; var s0:string);
var
   l,n: int64;
   o:link;
   st:string;
   i:byte := 1;
begin
   while i < 20 do
   begin
   o:=BD.begr;
   while  o^.b do
   begin
      if o^.data <> '' then
      begin
      st:=o^.data;
      l:=4;
      l:=length(o^.data);
      //write(l,' ');
      l:=length(o^.data);
      n:=1;
      while n<>0 do              //<---Вот этот цикл моей мечты!
      begin
         n:=pos(o^.data,s0);
         if n<>0 then begin delete(s0,n,l);  end;
      end;
      l:=0;
      end;
      o:=o^.next;
      l:=length(o^.data);
   end;
   inc(i)
   end;
end;
Код:
type
   data = string[128];
   link = ^elem; 
   elem = record
      data: data;
      b: boolean;
      next: link
   end;

Последний раз редактировалось Mister.V; 14.12.2011 в 23:44.
Mister.V вне форума Ответить с цитированием
Старый 14.12.2011, 23:36   #6
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Врядли дело в функции Pos, все методы сред разработок обычно хорошо написаны и отлажены.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 14.12.2011, 23:45   #7
Mister.V
 
Аватар для Mister.V
 
Регистрация: 14.12.2011
Сообщений: 7
По умолчанию

Код:
      while n<>0 do              //<---Вот этот цикл моей мечты!
      begin
         n:=pos(o^.data,s0);
         if n<>0 then begin delete(s0,n,l);  end;
      end;
Очевидно, что если убрать этот фрагмент из кода, то он станет рабочим, но пока он есть конструктор нормально работать отказывается!
Mister.V вне форума Ответить с цитированием
Старый 15.12.2011, 07:18   #8
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

есть вот такая штука:
заменяет в строке подстроку на ...
StrPage-строка
где # можно оставить пусто и он будет заменять тебе слово подстрока на пустоту
Код:
StrPage := AnsiReplaceStr(StrPage, 'подстрока', '#');
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 15.12.2011, 09:54   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Попробуйте StringReplace или ей подобные.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 15.12.2011, 11:07   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Хочешь юзай AnsiStringreplace или ReplaceString, много их. Или вот тебе, сам побырику накатал, аналог твоей, и работает )
Код:
function DelAllSubstr (TrgStr, Substr : string) : string;
var
  po, Len : Integer;
begin
  result := TrgStr;
  Len := Length(Substr);
  po := 1;                   
  repeat
    po := Posex(substr, result, po); // добавь в uses Strutils, или используй просто po := pos(substr, result);
    delete(Result, po, len);
  until po = 0;
end;
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск подстроки в строке ...на Турбо СИ ianush Помощь студентам 3 13.11.2011 19:05
Поиск подстроки в строке videolord Общие вопросы по Java, Java SE, Kotlin 2 10.04.2011 09:11
Поиск подстроки в строке valdemar593 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 03.06.2010 21:42
поиск подстроки в строке!!! StoneSour Общие вопросы C/C++ 2 15.03.2010 21:31