delphi : 相当与sscanf的函数ReadStrValues

delphi : 相当与sscanf的函数ReadStrValues

(引用)


{------------------------------------------------------------------------------}
{ 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;

你可能感兴趣的:(delphi : 相当与sscanf的函数ReadStrValues)