我正在整理过去使用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上的文档非常有限.... 感谢
答案 0 :(得分:7)
对ByteLength
的调用不正确。虽然documentation明确声明参数是以字节为单位的长度,但情况并非如此。您应该使用Length
,因为该函数实际上需要char
的单位而不是byte
的单位。