Как изменить функцию AnsiStrPos для возврата целочисленного смещения?(Delphi 7) - PullRequest
0 голосов
/ 29 июня 2019

Я использую Delphi 7, и мне нужна функция, аналогичная ansipos, но она должна использовать входной аргумент смещения и возвращать смещение целого числа. Я нашел код, подобный этому здесь https://github.com/Fr0sT-Brutal/Delphi_MiniRTL/blob/master/SysUtils.pas, и я хочу изменить вывод, чтобы он был целочисленным смещением. Как я могу получить целочисленное смещение от PChar?

function AnsiStrPos(Str, SubStr: PChar): PChar;
var
  L1, L2: Cardinal;
  ByteType : TMbcsByteType;
begin
  Result := nil;
  if (Str = nil) or (Str^ = #0) or (SubStr = nil) or (SubStr^ = #0) then Exit;
  L1 := StrLen(Str);
  L2 := StrLen(SubStr);
  Result := StrPos(Str, SubStr);
  while (Result <> nil) and ((L1 - Cardinal(Result - Str)) >= L2) do
  begin
    ByteType := StrByteType(Str, Integer(Result-Str));
    if (ByteType <> mbTrailByte) and
      (AnsiCompareStr(Result, SubStr) = 0) then Exit;
    if (ByteType = mbLeadByte) then Inc(Result);
    Inc(Result);
    Result := StrPos(Result, SubStr);
  end;
  Result := nil;
end;

Например, str: = "sub_string"; Из "sub_string" я хочу найти "string", начните поиск с позиции 4, и результат должен быть 0.

1 Ответ

1 голос
/ 29 июня 2019

Попробуйте это решение:

function AnsiStrOffset(AStr, ASubStr: PChar; const AStartPos: Cardinal = 0): Integer;
var
  VPos: PChar;
begin
  Result := -1; // not found
  if StrLen(AStr) <= AStartPos then begin
    Exit;
  end;
  Inc(AStr, AStartPos);
  VPos := AnsiStrPos(AStr, ASubStr);
  if VPos <> nil then begin
    Result := Int64(VPos) - Int64(AStr);
    // add AStartPos to Result if you need offset from the string beginning
  end;
end;

использование:

var
  VOffs: Integer;
  VStr, VSubStr: string;
begin
  VStr := 'sub_string';
  VSubStr := 'string';

  VOffs := AnsiStrOffset(PChar(VStr), PChar(VSubStr), 4);

  WriteLn(VOffs); // prints 0
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...