如何在freepascal中重复字符串
How to repeat string in freepascal
我需要帮助解决我遇到的这个问题。我需要多次重复某个字符串。例如字符串 'hello' 应该重复 3 次,输出如下:hellohellohello
我需要做的是让用户输入一个整数,然后输入另一个整数(n)。该程序将重复第一个整数 n 次。例如:11 3: 111111
并且该输出应该是整数,可以与另一个整数进行比较。
所以我认为我必须将其作为整数输入,将其转换为字符串,重复字符串 n 次并将新字符串放入整数变量,然后将其与我需要的进行比较。
有什么建议吗?
编辑:出现另一个问题:显然我的代码不能使用任何用途。那么没有他们怎么办呢?
为此,您可以使用 StrUtils 单元中的 DupeString
函数:
program duplicatestring;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, StrUtils
{ you can add units after this };
begin
writeln(DupeString('hello', 5));
Readln;
end.
显然,在此示例中我对字符串“hello”和 5 次重复进行了硬编码,但您可以从用户输入或任何您喜欢的地方获取字符串和重复计数。您可以编写自己的字符串函数,通过内部调用 DupeString
.
生成给定字符串的 N 次重复
我建议你看看 DupeString
的源代码,看看它是如何实现的,然后尝试用其他方法做同样的事情,例如使用 for
、while
或 repeat untiil
循环。
关于您的 "no USES" 更新,“DupeString”的源代码显示了一种执行此操作的方法:
Function DupeString(const AText: string; ACount: Integer): string;
var i,l : SizeInt;
begin
result:='';
if aCount>=0 then
begin
l:=length(atext);
SetLength(result,aCount*l);
for i:=0 to ACount-1 do
move(atext[1],Result[l*i+1],l);
end;
end;
基本上,SetLength
在堆上为 AText
的 ACount
个副本分配足够的空间,然后 move
将 AText
的内容复制到分配的空间中space ACount
次,函数结果告诉调用者在哪里可以找到堆分配的内容(因为 H+ 编译器指令 - 如果使用 H-,返回的结果不同,因为这使得编译器使用旧式、长度字节前缀的 Pascal 字符串)。
另一种方式是
function MyDupeString(const AText: string; ACount: Integer): string;
var i: SizeInt;
begin
result:='';
for i := 1 to ACount do
Result := Result + AText;
end;
代码少了很多,但效率低了很多,因为 for
循环的每次迭代都会为函数结果导致新的堆分配和前一个的释放。
任何你能用 Pascal for
循环做的事情,你都可以用 while .. do
或 repeat until
循环做。挑战:看看你是否可以编写自己的 MyDupeString
,它使用 while
循环,并将其作为你的答案提交给为你设置此任务的人。
所以源代码是这样的:
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, StrUtils
{ you can add units after this };
var
n,i:integer;
dvojice:array[1..80,1..80] of integer;
dvojicestr:array[1..80,1..80] of string;
dvojicestr1:array[1..80,1..80] of string;
dvojiceint:array[1..80,1..80] of integer;
begin
readln (n);
for i:=1 to n do begin
read (dvojice[i,1],dvojice[i,2],dvojice[i,3],dvojice[i,4]);
dvojicestr[i,1]:=inttostr(dvojice[i,1]);
dvojicestr1[i,1]:=dupestring(dvojicestr[i,1],dvojice[i,2]);
dvojicestr[i,2]:=inttostr(dvojice[i,3]);
dvojicestr1[i,2]:=dupestring(dvojicestr[i,2],dvojice[i,4]);
dvojiceint[i,1]:=strtoint(dvojicestr1[i,1]);
dvojiceint[i,2]:=strtoint(dvojicestr1[i,2]);
end;
writeln (dvojiceint[1,1]);
writeln (dvojiceint[1,2]);
writeln (dvojiceint[1,2]+dvojiceint[1,1]);
readln;
readln;
end.
我确信它可以更有效率,那些数组太大只是因为我不知道我需要它们有多大。变量的名称是我的母语,需要这样做才能让老师阅读。最后一部分只是为了检查它是否正常工作。
我需要帮助解决我遇到的这个问题。我需要多次重复某个字符串。例如字符串 'hello' 应该重复 3 次,输出如下:hellohellohello
我需要做的是让用户输入一个整数,然后输入另一个整数(n)。该程序将重复第一个整数 n 次。例如:11 3: 111111
并且该输出应该是整数,可以与另一个整数进行比较。 所以我认为我必须将其作为整数输入,将其转换为字符串,重复字符串 n 次并将新字符串放入整数变量,然后将其与我需要的进行比较。
有什么建议吗?
编辑:出现另一个问题:显然我的代码不能使用任何用途。那么没有他们怎么办呢?
为此,您可以使用 StrUtils 单元中的 DupeString
函数:
program duplicatestring;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, StrUtils
{ you can add units after this };
begin
writeln(DupeString('hello', 5));
Readln;
end.
显然,在此示例中我对字符串“hello”和 5 次重复进行了硬编码,但您可以从用户输入或任何您喜欢的地方获取字符串和重复计数。您可以编写自己的字符串函数,通过内部调用 DupeString
.
我建议你看看 DupeString
的源代码,看看它是如何实现的,然后尝试用其他方法做同样的事情,例如使用 for
、while
或 repeat untiil
循环。
关于您的 "no USES" 更新,“DupeString”的源代码显示了一种执行此操作的方法:
Function DupeString(const AText: string; ACount: Integer): string;
var i,l : SizeInt;
begin
result:='';
if aCount>=0 then
begin
l:=length(atext);
SetLength(result,aCount*l);
for i:=0 to ACount-1 do
move(atext[1],Result[l*i+1],l);
end;
end;
基本上,SetLength
在堆上为 AText
的 ACount
个副本分配足够的空间,然后 move
将 AText
的内容复制到分配的空间中space ACount
次,函数结果告诉调用者在哪里可以找到堆分配的内容(因为 H+ 编译器指令 - 如果使用 H-,返回的结果不同,因为这使得编译器使用旧式、长度字节前缀的 Pascal 字符串)。
另一种方式是
function MyDupeString(const AText: string; ACount: Integer): string;
var i: SizeInt;
begin
result:='';
for i := 1 to ACount do
Result := Result + AText;
end;
代码少了很多,但效率低了很多,因为 for
循环的每次迭代都会为函数结果导致新的堆分配和前一个的释放。
任何你能用 Pascal for
循环做的事情,你都可以用 while .. do
或 repeat until
循环做。挑战:看看你是否可以编写自己的 MyDupeString
,它使用 while
循环,并将其作为你的答案提交给为你设置此任务的人。
所以源代码是这样的:
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, StrUtils
{ you can add units after this };
var
n,i:integer;
dvojice:array[1..80,1..80] of integer;
dvojicestr:array[1..80,1..80] of string;
dvojicestr1:array[1..80,1..80] of string;
dvojiceint:array[1..80,1..80] of integer;
begin
readln (n);
for i:=1 to n do begin
read (dvojice[i,1],dvojice[i,2],dvojice[i,3],dvojice[i,4]);
dvojicestr[i,1]:=inttostr(dvojice[i,1]);
dvojicestr1[i,1]:=dupestring(dvojicestr[i,1],dvojice[i,2]);
dvojicestr[i,2]:=inttostr(dvojice[i,3]);
dvojicestr1[i,2]:=dupestring(dvojicestr[i,2],dvojice[i,4]);
dvojiceint[i,1]:=strtoint(dvojicestr1[i,1]);
dvojiceint[i,2]:=strtoint(dvojicestr1[i,2]);
end;
writeln (dvojiceint[1,1]);
writeln (dvojiceint[1,2]);
writeln (dvojiceint[1,2]+dvojiceint[1,1]);
readln;
readln;
end.
我确信它可以更有效率,那些数组太大只是因为我不知道我需要它们有多大。变量的名称是我的母语,需要这样做才能让老师阅读。最后一部分只是为了检查它是否正常工作。