DelphiFAQ Home Search:
General :: Programming :: Delphi :: Strings
Algorithms for string handling problems, implemented in Delphi but useful for any procedural language.

Articles:

This list is sorted by recent document popularity (not total page views).
New documents will first appear at the bottom.

Featured Article

How to reverse a string

Here are three examples how to reverse a string:

// Credit to Jim Burns
 
 //------------------------------------------------------
 // #1, While easy to understand suffers from a lot of memory reallocation.
 // Each time the next letter is added to s2, it's added to the beginning of the
 // string causing a reallocation of the entire string.
 //
 function ReverseString( s : string ) : string;
 var
   i  : integer;
   s2 : string;
 begin
   s2 := '';
   for i := 1 to Length( s ) do
     s2 := s[ i ] + s2;
   Result := s2;
 end;
 
 
 //------------------------------------------------------
 // #2, Taking advantage of the fact that we can work at both ends of the string
 // at once AND the fact that IF there is a middle character, ie. an odd number
 // of characters in the string, it doesn't change position at all and we can
 // eliminate all the memory allocations, work completely within the source
 // string swapping from end to end working toward the middle and only having to
 // make 1/2 of a loop through the string.
 //
 procedure ReverseStr(var Src : string);
 var
   i, j : integer;
   C1   : char;
 begin
   j := Length(Src);
   for i := 1 to (Length(Src) div 2) do
   begin
     C1 := Src[i];
     Src[i] := Src[j];
     Src[j] := C1;
     Dec(j);
   end;
 end;
 
  
 //------------------------------------------------------
 // #3, One disadvantage of #2 can be seen when trying to fill one control with
 // the contents of another.  For example, two TEdits.  Since TEdit.Text can't
 // be sent as a var parameter you'll need to first make use of a temporary
 // string and then set the second TEdit:
 // 
 //   var
 //     tStr : string;
 //   begin
 //     tStr := Edit1.Text;
 //     ReverseStr(tStr);
 //     Edit2.Text := tStr;
 // 
 // However, using #3 this code turns into,
 // 
 //     Edit2.Text := ReverseStr(Edit1.Text);
 // 
 // In addition, we lost 1 local var and the loop body was reduced since we
 // could use Result directly swapping as we go!
 //
 function ReverseStr(const Src : string) : string;
 var
   i, j : integer;
 begin
   j := Length(Src);
   SetLength(Result, j);
   for i := 1 to (Length(Src) div 2) do
   begin
     Result[i] := Src[j];
     Result[j] := Src[i];
     Dec(j);
   end;
 end;

Generated 0:01:46 on May 26, 2017