करने के लिए इसी तरह के विस्फोट () MEF द्वारा की पेशकश समारोह, लेकिन मतभेद (जिनमें से एक मैं बग समाधान पर विचार करें) के एक जोड़े के साथ:
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;
अंतर:
- aMax पैरामीटर वापस आने के लिए स्ट्रिंग्स की संख्या को सीमित करता है
- यदि इनपुट स्ट्रिंग को एक विभाजक द्वारा समाप्त किया जाता है तो एक नाममात्र "खाली" अंतिम स्ट्रिंग मौजूद माना जाता है
उदाहरण:
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
यह अनुगामी विभाजक और कुख्यात "खाली अंतिम तत्व" है जिसे मैं बग फिक्स मानता हूं।
मैंने अपने द्वारा सुझाए गए मेमोरी आवंटन परिवर्तन को भी शामिल किया, (मैंने गलती से सुझाव दिया कि इनपुट स्ट्रिंग में अधिकतम 50% विभाजक हो सकते हैं, लेकिन यह निश्चित रूप से 100% विभाजक तारों से मिलकर बन सकता है, खाली तत्वों की एक सरणी पैदा करता है!)