我正在整理用于使用FastStrings的旧代码,并实现了我的“ PosAnyCase”矿山的旧例程,该例程的运行方式应类似于“ Pos”。 (我希望SearchBuf比在两个字符串上调用UpperCase更好)。

function PosAnyCase( const AFindStr, AStr : string ) : integer;
// Returns the position of this substring within a string ignoring case


我正在使用SearchBuf,如下所示:

function PosAnyCase( const AFindStr, AStr : string ) : integer;
// Returns the position of this substring within a string ignoring case
var
  Start, ResultPos : PChar;
begin
  Start := PChar( AStr );

  ResultPos := SearchBuf(
    Start, ByteLength( AStr ),
    0, 0,
    AFindStr, [soDown] );

  if ResultPos = nil then
    Result := 0
   else
    Result := ResultPos-Start+1;
end;


当我从单元测试中调用此例程时,以下测试将通过:

  Check(
    PosAnyCase( '', '123' ) = 0 );
  Check(
    PosAnyCase( '2', '123' ) = 2 );
  Check(
    PosAnyCase( 'A', 'ABC' ) = 1 );
  Check(
    PosAnyCase( 'a', 'ABC' ) = 1 );
  Check(
    PosAnyCase( 'the', 'hellot there' ) = 8 );
  Check(
    PosAnyCase( 'THE', 'hellot there' ) = 8 );


但是此测试失败:

Check(
    PosAnyCase( 'nice', 'does not have n i c e' ) = 0 );


请问我做错了什么? SearchBuf上的文档非常有限。
谢谢

最佳答案

ByteLength的调用不正确。尽管documentation明确指出参数是字节长度,但事实并非如此。您应该改用Length,因为该函数实际上期望的是char的单位,而不是byte的单位。

10-05 22:26