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