2014-11-11 6 views
-2

У меня вопрос. Я написал эту небольшую программу, и она отлично работала, пока я не изменил s и s2 от string до регистрации. Мне нужно использовать ansistring, потому что оно будет длиннее 255 символов. Спасибо за ваш ответ.FCD exitcode 201 при использовании assistring. String этого не делает

{$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

ядро ​​вещь, чтобы знать, что ShortString часто не имеет никаких проблем с вне доступа границы строки (s [а], если не в допустимом диапазоне (а> = 1) и (а < = длина (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; 

Как это решить, как упражнение для читателя.

Научитесь использовать проверки диапазона, и вы найдете такие проблемы через минуту (подсказка add -Cr -gl для командной строки)