Benzer Patlat () MEF tarafından sunulan fonksiyonu, ancak farklılıkların (ı bir hata düzeltmesi düşünün hangi birinin) bir çift:
type
TArrayOfString = array of String;
function SplitString(const aSeparator, aString: String; aMax: Integer = 0): TArrayOfString;
var
i, strt, cnt: Integer;
sepLen: Integer;
procedure AddString(aEnd: Integer = -1);
var
endPos: Integer;
begin
if (aEnd = -1) then
endPos := i
else
endPos := aEnd + 1;
if (strt < endPos) then
result[cnt] := Copy(aString, strt, endPos - strt)
else
result[cnt] := '';
Inc(cnt);
end;
begin
if (aString = '') or (aMax < 0) then
begin
SetLength(result, 0);
EXIT;
end;
if (aSeparator = '') then
begin
SetLength(result, 1);
result[0] := aString;
EXIT;
end;
sepLen := Length(aSeparator);
SetLength(result, (Length(aString) div sepLen) + 1);
i := 1;
strt := i;
cnt := 0;
while (i <= (Length(aString)- sepLen + 1)) do
begin
if (aString[i] = aSeparator[1]) then
if (Copy(aString, i, sepLen) = aSeparator) then
begin
AddString;
if (cnt = aMax) then
begin
SetLength(result, cnt);
EXIT;
end;
Inc(i, sepLen - 1);
strt := i + 1;
end;
Inc(i);
end;
AddString(Length(aString));
SetLength(result, cnt);
end;
Farklılıklar:
- aMax parametresi, döndürülecek dizelerin sayısını sınırlar
- Giriş dizisi bir ayırıcı tarafından sonlandırılırsa, nominal "boş" bir son dizenin var olduğu kabul edilir.
Örnekler:
SplitString(':', 'abc') returns : result[0] = abc
SplitString(':', 'a:b:c:') returns : result[0] = a
result[1] = b
result[2] = c
result[3] = <empty string>
SplitString(':', 'a:b:c:', 2) returns: result[0] = a
result[1] = b
Hata düzeltmesi olarak düşündüğüm, sondaki ayırıcı ve kavramsal "boş son öğe" dir.
Ayrıca önerdiğim bellek ayırma değişikliğini de iyileştirme ile birleştirdim (yanlışlıkla girdi dizesinin en fazla% 50 ayırıcı içerebileceğini öne sürdüm, ancak elbette% 100 ayırıcı dizelerden oluşarak bir dizi boş öğe ortaya çıkarabilir!)