反转数组中的字符串

时间:2016-06-08 21:30:23

标签: delphi for-loop delphi-strings

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)...不确定为什么它不能正常工作以及我缺少什么

5 个答案:

答案 0 :(得分:3)

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.

答案 1 :(得分:2)

字符串是一个char数组,添加了一些额外的铃声和口哨声 因此,array of stringarray 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技巧多长时间,如代码中所示。它生成了更快的代码。
  • 您可以使用Sleep暂停控制台应用,而不是ReadLn。按下一个键后它会立即继续。
  • 不要将writeln放入您的日常工作中。
  • 注意字符串中的第一个元素是1,但数组中的第一个元素是0(除非另有定义);动态数组总是从零开始计数。
  • 请注意,参数定义中的array of stringopen array;与动态数组不同的是。
  • 单个大写标识符(如TK等)通常用于泛型类型,不应将它们用于普通变量;请改用描述性名称。

答案 2 :(得分:1)

来吧! 'bob'是你不应该尝试测试反向例程的其中一个词。但问题不仅限于此。

你的问题在这里

CreateDesktop()
OpenDesktop()

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

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

此外,您需要在第一个循环中设置for J := L downto 1 do M := M + A[I][J]; ,当您开始在其中累积字符时,它将没有任何内容。

第三,将写入部分M := ''移动到第一个循环中,在那里得到一个漂亮的分离输出。

总而言之,它将是:

WriteLn(M)

答案 3 :(得分:1)

我首选的解决方案是

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;

答案 4 :(得分:1)

uses
   System.SysUtils, System.StrUtils;

var
   Forwards, backwards : string;

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

// dcba