{ **** UBPFD *********** by delphibase.endimus.com ****
>>
Вроде работает
Substr - подстрока, S - строка, fromPos - с какой позиции искать
Если вхождение не найдено, возвращает 0
Ограничения - как для ansiStrPos
Зависимости: SysUtils
Автор: Romkin, romkin@pochtamt.ru, Москва
Copyright: Romkin
Дата: 18 июля 2002 г.
***************************************************** }function fAnsiPos(const Substr, S: string; FromPos: integer): Integer;
var
P: PChar;
begin
Result := 0;
P := AnsiStrPos(PChar(S) + fromPos - 1, PChar(SubStr));
if P <> nilthen
Result := Integer(P) - Integer(PChar(S)) + 1;
end;
Перевод контента на русский язык:
Функция fAnsiPos предназначена для поиска подстроки (Substr) в основной строке (S) начиная с указанной позиции (FromPos). Функция возвращает позицию первого вхождения подстроки, если она найдена, или 0, если не найдена.
Распределение кода:
Result := 0;: Инициализирует переменную результата в 0, которая будет использоваться для хранения позиции подстроки.
P := AnsiStrPos(PChar(S) + fromPos - 1, PChar(SubStr));: Эта строка вызывает встроенную функцию AnsiStrPos, которая ищет первое вхождение SubStr в S, начиная с позиции, указанной в FromPos. Результат хранится в переменной P.
if P <> nil then Result := Integer(P) - Integer(PChar(S)) + 1;: Если P не равно nil (т.е., подстрока была найдена), функция рассчитывает позицию подстроки и хранит ее в Result. Рассчет включает вычитание адреса начала основной строки (PChar(S)) из P и добавление 1, потому что AnsiStrPos возвращает указатель на первый символ подстроки.
Указанные ограничения в коде состоят в том, что эта функция имеет те же ограничения, что и AnsiStrPos, то есть она работает только с ANSI-строками (т.е., строками, закодированными в один байт) и может не работать правильно с Unicode-строками.
В целом, код ясен и структурирован. Однако, есть минорное ограничение: переменная Result должна быть инициализирована более конкретным значением, чем просто 0, потому что это может привести к неожиданному поведению, если функция возвращает 0 (что она сделает, если подстрока не найдена). Вместо этого можно инициализировать Result в -1, что будет указывать на то, что подстрока не была найдена.
Вот обновленная версия кода с этими предложениями:
functionfAnsiPos(constSubstr,S:string;FromPos:integer):Integer;varP:PChar;beginResult:=-1;// Инициализирует результат в -1, если не найденоP:=AnsiStrPos(PChar(S)+fromPos-1,PChar(SubStr));ifP<>nilthenResult:=Integer(P)-Integer(PChar(S))+1;end;
В статье описан функционал поиска подстроки в строке с заданной позиции, реализованный в виде процедуры fAnsiPos, которая возвращает индекс начала обнаруженной подстроки или 0, если она не найдена.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS