在c中,可以实现如printf这样的不定长参数的函数.
支持printf("%s %d %c",ttt,dd,ss);的调用在delphi中如何编写如printf这样的不定长参数的函数.

解决方案 »

  1.   

    Function sscanf(Data : String; Format : String; Const Args : Array Of Const) : Integer;Var
      At                    : Integer;
      DataAt                : Integer;
      Results               : Integer;
      ScanToken             : String;
      StringToken           : String;
      FieldType             : TFieldType;
      FieldWidth            : Integer;
      CharSet               : TCharSet;
      Stored                : Boolean;
      OutOfData             : Boolean;  P                     : Pointer;Begin
      At := 1;
      DataAt := 1;
      Results := 0;  While At<=Length(format) Do
      Begin
        Try
          ScanToken := GetScanfToken(Format,At);
          InterpretScanToken(ScanToken,FieldType,FieldWidth,CharSet,Stored);
        Except
          Break;
        End;
        if (FieldType<>ftCount) Then
        Begin
          StringToken := GetDataToken(Data,DataAt,OutOfData,FieldType,FieldWidth,CharSet);
        End;    If (FieldType=ftLitteral) Then
        Begin
          If (StringToken<>ScanToken) Then
          Begin
            Break;
          End;
        End;    If (Not OutOfData) Then
        Begin
          If Not CheckFieldData(StringToken,FieldType) Then Break;
          If Stored Then
          Begin
            If (Results+Low(Args))>High(Args) Then
            Begin
              Raise Exception.Create('Insufficent pointers for format specifiers!');
            End;
            P := Args[Results+Low(Args)].VPointer;
            StoreData(StringToken,FieldType,FieldWidth,DataAt,P,Args[Results+Low(Args)].VType);
            Inc(Results);
          End;
        End;
      End;
      Result := Results;
    End;