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.