反转数组中的字符串

Reverse strings in an array

procedure ReverseArray(var A : array of string);
var I,J,L : integer;
begin
  for I := Low(A) to High(A) do
  begin
    L := length(A[I]);
    for J := L downto 1 do M := M + A[I];
  end;
  writeln(M);
end;


begin
  for I := 1 to 4 do readln(T[I]);
  ReverseArray(T);
  sleep(40000);
end.

我想在这里做的基本上是反转数组中的每个字符串,但我做不到,上面的代码所做的基本上是重复单词取决于它们的长度(我写 'bob' 在数组中,该过程将给我 'bob' 三次,因为长度是 3) ...不确定为什么它不能正常工作以及我缺少什么

字符串是一个 char 数组,添加了一些额外的功能。
所以 array of string 很像 array of array of char.
如果要反转字符串,则必须访问每个字符并将其反转。

procedure ReverseArray(var A : array of string);
var 
  i,j,Len : integer;
  B: string;
begin
  for i := Low(A) to High(A) do begin
    Len := length(A[i]);
    SetLength(B, Len);  //Make B the same length as A[i].
    //B[Len] = A[i][1]; B[Len-1]:= A[i][2] etc...
    for j := Len downto 1 do B[j]:= A[i][(Len-J)+1];
    //Store the reversed string back in the array.
    A[i]:= B; 
    //Because A is a var parameter it will be returned.
    //Writeln(B); //Write B for debugging purposes.
  end;
end;


var
  i: integer;
  Strings: array [0..3] of string;
begin
  for i := 0 to 3 do readln(Strings[i]);
  ReverseArray(Strings);
  for i := 0 to 3 do writeln(Strings[i]);
  WriteLn('Done, press a key...'); 
  ReadLn;
end.

一些提示:

  • 不要像M那样使用全局变量,而是声明一个局部变量。
  • 如果可以避免,不要在循环中执行 AStr:= AStr + AChar。如果您知道结果将持续多长时间,请使用代码中所示的 SetLength 技巧。它生成更快的代码。
  • 您可以使用 ReadLn 而不是 Sleep 来停止控制台应用程序。只要你按下一个键,它就会继续。
  • 不要把 writeln 放在你的日常工作中。
  • 注意字符串的第一个元素是1,但是数组的第一个元素是0(除非另有定义);动态数组总是从零开始计数。
  • 注意参数定义中的array of string是一个open array;与动态数组不同。
  • TK等单个大写标识符通常用于泛型类型,你不应该将它们用于普通变量;请改用描述性名称。

加油! 'bob' 是您不应该尝试测试反向例程的那些词之一。但问题不止于此。

你的问题就在这里

for J := L downto 1 do 
  M := M + A[I];

您正在尝试将整个字符串而不是您要访问的字符添加到 M 变量。所以,应该是

for J := L downto 1 do 
   M := M + A[I][J];

此外,您还需要在第一个循环中设置 M := '',当您开始向其中累积字符时,它将没有任何内容。

第三,将写作部分 WriteLn(M) 移动到第一个循环中,您将获得一个漂亮的分离输出。

放在一起,它将是:

for I := Low(A) to High(A) do
begin
    L := length(A[I]);

    M := '';        
    for J := L downto 1 do 
       M := M + A[I][J];

    writeln(M);
end;

Delphi 在 StrUtils 单元中有一个 ReverseString() 函数。

uses
  StrUtils;

type
  TStrArray = array of string;

procedure ReverseArray(var A : TStrArray);
var
  I: integer;
begin
  for I := Low(A) to High(A) do
    A[I] := ReverseString(A[I]);
end;

var
  T: TStrArray;
  I: Integer
begin
  SetLength(T, 4);
  for I := 1 to 4 do Readln(T[I]);
  ReverseArray(T);
  ...
end.

我的首选解决方案是

type
  TStringModifier = function(const s: string): string;

procedure ModifyEachOf( var aValues: array of string; aModifier: TStringModifier );
var
  lIdx: Integer;
begin
  for lIdx := Low(aValues) to High(aValues) do
    aValues[lIdx] := aModifier( aValues[lIdx] );
end;

最后是

var
  MyStrings: array[1..3] of string;
begin
  MyStrings[1] := '123';
  MyStrings[2] := '456';
  MyStrings[3] := '789';

  ModifyEachOf( MyStrings, SysUtils.ReverseString );
end;
uses
   System.SysUtils, System.StrUtils;

var
   Forwards, backwards : string;

begin
    forwards:= 'abcd';
    backwards:= ReverseString(forwards);
    Writeln(backwards);
    Readln;
end;

// dcba