-2

我有个问题。我写了这个小程序,它运行良好,直到我改变ss2stringansistring。我需要使用 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.
4

1 回答 1

0

要知道的核心是短字符串通常没有越界字符串访问的问题(s[a] 当 a 不在允许的范围内 (a>=1) 和 (a<=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)

于 2014-11-13T10:01:03.530 回答