Код выхода FPC 201 при использовании ansistring. Строка не делает этого
У меня вопрос. Я написал эту маленькую программу, и она работала отлично, пока я не изменился s
а также s2
от string
к ответу. Мне нужно использовать 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 ответ
Главное, что нужно знать, это то, что у короткой строки часто нет проблем с доступом к строке за пределами границ (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;
но вы не сбрасываете "а". Таким образом, выполняется следующее условие, и доступ s [a] взрывается.
if not (a=length(s)+1) then begin
if s[a]=' ' then
i:=a;
Как решить это, оставлено читателю в качестве упражнения.
Научитесь использовать проверку диапазона, и через минуту вы обнаружите подобные проблемы (подсказка добавьте -Cr -gl в командную строку)