delphi – 使用StrUtils’SearchBuf’的奇怪行为

我正在整理过去使用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 ),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的单位.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...