我有一个问题。我写了这个小程序,它运行得很好,直到我将s
和s2
从string
更改为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.
答案 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添加到命令行)