其他分享
首页 > 其他分享> > CnCommon单元之SameCharCounts、CharCounts【6】

CnCommon单元之SameCharCounts、CharCounts【6】

作者:互联网

// 两个字符串的前面的相同字符数
function SameCharCounts(s1, s2: string): Integer;
var
  Str1, Str2: PChar;
begin
  Result := 1;
  s1 := s1 + #0;
  s2 := s2 + #0;
  Str1 := PChar(s1);
  Str2 := PChar(s2);

  while (s1[Result] = s2[Result]) and (s1[Result] <> #0) do
  begin
    Inc(Result);
  end;
  Dec(Result);
  if (StrByteType(Str1, Result - 1) = mbLeadByte) or
    (StrByteType(Str2, Result - 1) = mbLeadByte) then
    Dec(Result);
end;

// 在字符串中某字符出现的次数
function CharCounts(Str: PChar; Chr: Char): Integer;
var
  p: PChar;
begin
  Result := 0;
  p := StrScan(Str, Chr);
  while p <> nil do
  begin
    case StrByteType(Str, Integer(p - Str)) of
      mbSingleByte: begin
        Inc(Result);
        Inc(p);
      end;
      mbLeadByte: Inc(p);
    end;
    Inc(p);
    p := StrScan(p, Chr);
  end;
end;

SameCharCounts算出两个字符串前面相同的字符数,功能很好理解,前面有几个字符相同就是结果.

知识点1:字符串转字符指针同样在尾部加了结束符

知识点2:这里的string同样当做字符串数组在处理

知识点3:StrByteType函数功能为获取字节的类型,主要有三种类型:SingleByte{ASCII 字符} LeadByte{双字节字符前半} TrailByte{双字节字符后半}

这里又引申出一个新的函数:

//利用 StrByteType 做了个函数:
function GetByteType(p: PChar; i: Integer): string;
var
  bt: TMbcsByteType;
begin
  bt := StrByteType(p, i);
  case bt of
    mbSingleByte : Result := 'SingleByte'; {ASCII 字符}
    mbLeadByte   : Result := 'LeadByte';   {双字节字符前半}
    mbTrailByte  : Result := 'TrailByte';  {双字节字符后半}
  end;
end;

 调用示例:

procedure TForm1.Button2Click(Sender: TObject);
var
p: PChar;
i: Integer;
begin
p := 'abc中国123';

for i := 0 to Length(p) - 1 do
Memo1.Lines.Add(GetByteType(p, i));

{显示结果如下:
SingleByte
SingleByte
SingleByte
LeadByte
TrailByte
LeadByte
TrailByte
SingleByte
SingleByte
SingleByte
}
end;

得出结果中文字符会显示LeadByte+TrailByte,英文数字字符直接显示SingleByte

 

CharCounts函数计算出字符在字符串中出现的次数

知识点1:StrScan函数返回一个字符在字符串中位置的指针

标签:字符,begin,CnCommon,PChar,end,Result,SingleByte,SameCharCounts,CharCounts
来源: https://www.cnblogs.com/YXGust/p/14764125.html