如何在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 的源代码,看看它是如何实现的,然后尝试用其他方法做同样的事情,例如使用 forwhilerepeat 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 在堆上为 ATextACount 个副本分配足够的空间,然后 moveAText 的内容复制到分配的空间中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 .. dorepeat 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. 

我确信它可以更有效率,那些数组太大只是因为我不知道我需要它们有多大。变量的名称是我的母语,需要这样做才能让老师阅读。最后一部分只是为了检查它是否正常工作。