String 如何修改ANSISTROPS函数以返回整数偏移量?(德尔菲7)

String 如何修改ANSISTROPS函数以返回整数偏移量?(德尔菲7),string,delphi,pointers,String,Delphi,Pointers,我使用的是Delphi7,我希望函数类似于ansipos,但它应该使用输入偏移量参数并返回整数偏移量。我在这里发现了类似的代码,我想将输出修改为整数偏移量。如何从PChar获取整数偏移量 function AnsiStrPos(Str, SubStr: PChar): PChar; var L1, L2: Cardinal; ByteType : TMbcsByteType; begin Result := nil; if (Str = nil) or (Str^ = #0) o

我使用的是Delphi7,我希望函数类似于ansipos,但它应该使用输入偏移量参数并返回整数偏移量。我在这里发现了类似的代码,我想将输出修改为整数偏移量。如何从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;
函数AnsiStrPos(Str,SubStr:PChar):PChar;
变量
L1,L2:基数;
ByteType:TMbcsByteType;
开始
结果:=无;
如果(Str=nil)或(Str^=#0)或(SubStr=nil)或(SubStr^=#0),则退出;
L1:=StrLen(Str);
L2:=StrLen(SubStr);
结果:=StrPos(Str,SubStr);
而(Result nil)和((L1-Cardinal(Result-Str))>=L2)do
开始
ByteType:=StrByteType(Str,Integer(Result Str));
if(ByteType mbTrailByte)和
(AnsiCompareStr(Result,SubStr)=0)然后退出;
如果(ByteType=mbLeadByte),则Inc(结果);
公司(结果);
结果:=STRPO(结果,SubStr);
终止
结果:=无;
终止
例如str:=“子字符串”;从“sub_string”我想找到“string”,从位置4开始搜索,结果应该是0。

尝试以下解决方案:

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;

非常感谢您的解决方案。这为我省去了上周使用ansipos()和DIRegex.match()函数时遇到的许多问题。@用户为什么不自己调试它?为什么在所有输入都来自
String
的情况下还要使用
PChar
呢?如果你知道如何做得更好,你可以编写一个。我不熟悉这些东西,我只是在互联网上查找一些比ansipos或regex match更适合我需要的函数。此函数的使用取决于输入字符串的长度,长度必须大于1个字符,或者我需要在字符串末尾添加\0。。像PChar(“$”+chr(0))一样,您希望使用PChar而不是普通字符串的具体原因是什么?你见过PosEx吗?我不知道StrUtils中的这个函数。Thanx表示这一点。
PosEx()
在您链接的文件中声明和定义-它已经在您面前了。PosEx将使用绝对偏移量,但您可以轻松地将其包装在一个函数中,该函数可以执行以下操作:=PosEx(SubStr,YourString,offset)-offset。如果找不到字符串,则结果将为
<0
(前提是指定>=1的有效偏移量)。
var
  VOffs: Integer;
  VStr, VSubStr: string;
begin
  VStr := 'sub_string';
  VSubStr := 'string';

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

  WriteLn(VOffs); // prints 0
end;