procedure ClearNoDigits(var A: string);
var
i: integer;
begin
i := 1;
while length(A)>i do if not (char.IsDigit(A[i])) then delete(A, i, 1) else i += 1;
end;
По идее, принцип работы должен был быть следующий: строка A посимвольно обрабатывается, на выходе мы имеем A, состоящую из цифр. Но на практике именно после реализации процедуры ClearNoDigits основная программа уходит в бесконечный цикл. Проблема в while (или где-то ещё в процедуре) или смотреть надо в основной программе? Спасибо.
У вас условие цикла неверно задано. Нужно >=.
А в остальном она рабочая, только написана очень странно. Кроме IsDigit и += у вас не используется ни чего от PABC.
Ведь гораздо предпочтительней писать A.Length вместо length(A) и A[i].IsDigit вместо char.IsDigit(A[i]), ну и лучше написать A := A.Remove(i-1, 1), ибо мы точно знаем, что делаем.
Итого:
procedure ClearNoDigits(var A: string);
begin
var i := 1;
while A.Length >= i do
if A[i].IsDigit then
i += 1
else
A := A.Remove(i-1, 1);
end;
begin
var s := 'dfgdfgdfg 123 dfgdfg 456 gdf gd';
ClearNoDigits(s);
WriteLn(s);
end.
А если воспользоваться регулярным выражением, то данная процедура вообще не нужна:
WriteLn( Regex.Replace(s, '[^1-9]', '').ToString );
Ещё вариант.
function ClearNoDigits(s: string) := s.where(c -> c.IsDigit).joinintostring('');
begin
var s := 'a1b2c';
write(ClearNoDigits(s)); // -> 12
end.