(引用)
{------------------------------------------------------------------------------}
{ procedure ReadStrValues }
{ }
{ 功能说明: 根据指定的分隔符将一个字符串分解为若干个子串 }
{ 如果传递的子串数量超过源串可以解析的字串数, 则多传的子串将置为空串 }
{ 参 数: }
{ Str : 待分解的字符串 }
{ StrArr: 存放分解后的子串的数组, 以字符串指针数组传递 }
{ Ch : 分隔符定义, 缺省为 ";" }
{------------------------------------------------------------------------------}
procedure ReadStrValues(Str: string; StrArr: array of PString; Ch: Char = ';');
var
I, StrLen, StrPos, ArrLen, ArrIndex: Integer;
begin
StrLen := Length(Str); // 字符串长
ArrLen := Length(StrArr); // 待取出的字符串个数
if ArrLen = 0 then Exit; // 如果字符串指针数组中无元素,则直接退出
StrPos := 1; // 当前读到的字符串位置
ArrIndex := 0; // 当前字符串指针数组位置
// 此处将 Str 长度加1,用于后面判断是否已读完整个字串
for I := 1 to StrLen + 1 do
begin
// 注意此处条件位置不可倒置(骤死式判断)
if (I = StrLen + 1) or (Str[I] = Ch) then
begin
// 拷贝读到的字符串
StrArr[ArrIndex]^ := Copy(Str, StrPos, I - StrPos);
StrPos := I + 1;
// 如果需要读的字符串指针数组已完成,则退出
Inc(ArrIndex);
if ArrIndex >= ArrLen then Exit;
end;
end;
// 检查是否所有的字符串指针都读到了,如果没有读到,将被设置为空串
for I := ArrIndex to ArrLen - 1 do
StrArr[I]^ := '';
end;
{------------------------------------------------------------------------------}
{ 测试该函数 }
{------------------------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
const
SampleStr = '张三;男;41';
var
S1, S2, S3, S4: string;
begin
// 正常字串解析
S1 := 'S1'; S2 := 'S2'; S3 := 'S3'; S4 := 'S4';
ReadStrValues(SampleStr, [@S1, @S2, @S3]);
ShowMessage(Format('"%s", "%s", "%s", "%s"', [S1, S2, S3, S4]));
// 待读字串少于源串内容测试
S1 := 'S1'; S2 := 'S2'; S3 := 'S3'; S4 := 'S4';
ReadStrValues(SampleStr, [@S1, @S2]);
ShowMessage(Format('"%s", "%s", "%s", "%s"', [S1, S2, S3, S4]));
// 待读字串多于源串内容测试
S1 := 'S1'; S2 := 'S2'; S3 := 'S3'; S4 := 'S4';
ReadStrValues(SampleStr, [@S1, @S2, @S3, @S4]);
ShowMessage(Format('"%s", "%s", "%s", "%s"', [S1, S2, S3, S4]));
// 待读字串为空测试
S1 := 'S1'; S2 := 'S2'; S3 := 'S3'; S4 := 'S4';
ReadStrValues(SampleStr, []);
ShowMessage(Format('"%s", "%s", "%s", "%s"', [S1, S2, S3, S4]));
// 源串为空测试
S1 := 'S1'; S2 := 'S2'; S3 := 'S3'; S4 := 'S4';
ReadStrValues('', [@S1, @S2, @S3]);
ShowMessage(Format('"%s", "%s", "%s", "%s"', [S1, S2, S3, S4]));
end;