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)...不确定为什么它不能正常工作以及我缺少什么
答案 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 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
技巧多长时间,如代码中所示。它生成了更快的代码。 Sleep
暂停控制台应用,而不是ReadLn
。按下一个键后它会立即继续。 writeln
放入您的日常工作中。 array of string
是open array;与动态数组不同的是。 T
,K
等)通常用于泛型类型,不应将它们用于普通变量;请改用描述性名称。 答案 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