使用ansistring时FPC exitcode 201。字符串不会这样做

时间:2014-11-11 15:08:28

标签: string pascal ansistring

我有一个问题。我写了这个小程序,它运行得很好,直到我将ss2string更改为ansistring。我需要使用ansistring,因为它将超过255个字符。谢谢你的回复。

    {$H+}
program Test;
uses Crt;
var s,s2:string;
    konec,radek:boolean;
    i,a,z:integer;
begin
  ClrScr;
  s:='';
  s2:='';
  i:=0;
  a:=0;
  z:=1;
  konec:=false;
  radek:=false;
  repeat
    s2:='';
    readln(s2);
    s:=s+s2;
  until s2='';
  while konec=false do begin
    while radek=false do begin
      a:=a+1;
      if length(s)+1=a then begin
        radek:=true;
        s:='';
        if a<60 then writeln(s2);   
      end;
      if not (a=length(s)+1) then begin
      if s[a]=' ' then
        i:=a;
      s2:=s2+s[a];
      if not (s[a]=' ') then
      if a=60 then begin
        radek:=true;
        delete(s2,i,60-i+1);
        writeln(s2);
        s2:='';
        delete(s,z,i);
      end;
      if (s[a]=' ') and (a=60) then begin
        radek:=true;
    writeln(s2);
    s2:='';
    delete(s,z,i);
      end;
      end;
    end;
    radek:=false;
    a:=0;
    if (s='') then konec:=true;
  end;
  readkey;
end.

1 个答案:

答案 0 :(得分:0)

核心要知道的是,shorttring通常没有超出边界字符串访问的问题(s [a]当a不在允许的范围内(a&gt; = 1)和(a&lt; = length(s)) )

您在此代码中将S设置为'':

 if length(s)+1=a then begin
    radek:=true;
    s:='';
    if a<60 then writeln(s2);   
  end;

但你没有重置“a”。因此,以下条件成立,并且s [a]访问炸弹。

  if not (a=length(s)+1) then begin
  if s[a]=' ' then
    i:=a;

如何解决这个问题留给读者练习。

学习使用范围检查,你会在一分钟内发现这样的问题(提示将-Cr -gl添加到命令行)