Ben de alternatif bir yöntem önereyim. Hem Stack kullanımına da örnek olur.
Önce verilen ifadeyi \ karakterinin olduğu yerlerden bölelim. Bu ExtractStrings prosedürünü veya TStringList sınıfının DelimitedText özelliğini kullanarak yapabilirsiniz.
Örneğin "C:\A\B\..\..\C\..\D" stringi bölündüğü zaman elimizde şöyle bir liste olacak.
".." stringden farklı her stringi sırayla stack'e push ediyoruz. Her ".." stringi ile karşılaştığımızda stackteki son elamanı çekiyoruz (pop).
Kod: Tümünü seç
C: (push) Stack : C:
A (push) Stack : C:, A
B (push) Stack: C:,A,B
.. (pop) Stack: C:,A
.. (pop) Stack: C:
C (push) Stack: C:,C
.. (pop) Stack: C:
D (push) Stack: C:,D
Delphi için örnek kod
Kod: Tümünü seç
uses contnrs;
Function Sadelestir(const Str: String):String;
var
Strs : TStringList;
Stack : TStack;
i : integer;
begin
Strs := TStringList.Create;
Stack := TStack.Create;
try
Strs.Delimiter := '\';
Strs.DelimitedText := Str;
for i := 0 to strs.Count-1 do
if Strs[i] <> '..' then
stack.Push(PAnsiChar(Strs[i]))
else
stack.Pop;
while stack.Count > 0 do
Result := PAnsiChar(stack.Pop) + '\' + Result;
finally
Strs.Free;
Stack.Free;
end;
end;