如何在freepascal中重复字符串

时间:2018-01-26 19:00:37

标签: string pascal lazarus freepascal

我需要帮助解决这个问题。我需要多次重复某个字符串。例如string' hello'应该重复3次输出如下:hellohellohello

我需要做的是让用户输入一个整数,然后是另一个(n)。程序将重复第一个整数n次。例如:11 3:111111

该输出应该是整数,可以与另一个整数进行比较。 所以我认为我必须输入整数,将其转换为字符串,重复字符串n次并将新字符串放入整数变量,然后将其与我需要的相比较。

有什么建议吗?

编辑:发生了另一个问题:显然我的代码不能使用任何用途。那怎么能和他们一起完成呢?

2 个答案:

答案 0 :(得分:2)

您可以使用StrUtils单元中的DupeString函数:

program duplicatestring;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils, StrUtils
  { you can add units after this };

begin
  writeln(DupeString('hello', 5));
  Readln;
end.

显然,我已经对字符串进行了硬编码'你好'在这个例子中有5个重复,但你可以从用户输入或任何你喜欢的地方获得字符串和重复计数。你可以编写自己的字符串函数,通过内部调用DupeString来生成给定字符串的N个重复。

我建议您查看DupeString的源代码,了解其实现方式,然后尝试其他方法,例如:使用forwhilerepeat untiil循环。

重新使用"没有使用"更新,`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;

基本上,SetLengthACount ATextmove个副本分配足够的空间,然后将ATextACount个内容复制到已分配的空间{ {1}}次,函数结果告诉调用者在哪里找到堆分配的内容(因为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,并将其作为答案给你设置此任务的人。

答案 1 :(得分:1)

所以源代码如下所示:

    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. 

我相信它可以更高效,那些阵列是如此之大,因为我并不知道我需要它们有多大。变量的名称是我的母语,需要这样做才能让老师阅读。最后一部分仅用于检查它是否正常工作。