Ich suche eine Funktion, welche in einem String alle Vorkommen von substr findet und die Positionen in ein Array abspeichert.
Gibt es eine fertige Function, welche diese Arbeit macht ?
Bevor ich selbst eine schreibe.
const
s = '123-23-45-123';
type
TIntegers = array of integer;
var
Funde: TIntegers;
function FindStrings(const substr, s: string): TIntegers;
begin
Result := [4, 7, 10]; // Nur als Pseudo
end;
begin
Funde := FindStrings('-', s);
WriteLn(Length(Funde));
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Ein Beispielprogramm mit "GOTO"??????????????
Ich dachte "GOTO" ist verpönt und sollte heutzutage nicht mehr verwendet werden, wenn ich mich nicht irre?
Hihi, auf einen Goto-Kommentar habe gewartet.
Ich finde, Goto ist hier die pragmatischte Lösung - unter der Voraussetzung, dass es alleinig in einer kleinen übersichtlichen Funktion vorkommt, die auf einen Blick zu erfassen ist.
Würde Pascal eine Schleifensyntax anbieten, die hier ohne zwei Abbruchbedingungen auskommen würde, würde ich ich sie nehmen. Gibt es meines Wissens aber nicht.
Man kann es einfach durch Repeat ... until false; ersetzen, wenn man möchte.
Ich weiß nicht, ob der Compiler bei "until false" wirklich eine Prüfung durchführt oder vielleicht sogar für diesen Fall optimiert ist.
Ach ja. eigentlich spielt es bzgl. der Geschwindigkeit wahrscheinlich keine Rolle.
{$modeswitch arrayoperators on}
uses
SysUtils;
const
s = '(123,abc,456,def)';
type
TIntegers = array of integer;
var
Funde: TIntegers;
function FindStrings(s: string): TIntegers;
var
i: integer;
begin
Result := [];
for i := 1 to Length(s) do begin
if s[i] in ['(', ',', ')'] then begin
Result += [i];
end;
end;
end;
Funde := FindStrings(s);
WriteLn(Length(Funde));
Oder noch viel einfacher, da habe ich sogar schon die einzelnen Strings fertig.
Ich dachte "GOTO" ist verpönt und sollte heutzutage nicht mehr verwendet werden, wenn ich mich nicht irre?
Ich war auch schon in Situationen, da ich keine Alternative zu GOTO fand. Ansonsten ein typischer GW-BASIC Befehl.
Auch in Assembler findet man es viel als "jmp".
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Würde Pascal eine Schleifensyntax anbieten, die hier ohne zwei Abbruchbedingungen auskommen würde, würde ich ich sie nehmen. Gibt es meines Wissens aber nicht.
Man kann es einfach durch Repeat ... until false; ersetzen, wenn man möchte.
Ich bevorzuge in diesem Fall while true do... , wenn es wirklich notwendig ist.
Da sieht man von Anfang an worum es geht und dass irgendwo ein break folgen muss. Man wundert sich dann nicht über den Abbruch mit break (oder exit), bevor man "until false" gesehen hat.
program Project1;
uses SysUtils;
var s: String;
res : TStringArray;
i : integer;
begin
s := 'abcdef-ghi-jkl';
res := s.Split('-');
for i := 0 to high(res) do
writeln(res[i]);
readln;
end.
function FindStrings(const substr, s: string): TIntegers;
var
SearchIndex: SizeInt = 0;
begin
Result := [];
if substr.IsEmpty then
Exit;
while SearchIndex < s.Length-substr.Length do
begin
SearchIndex := s.IndexOf(substr, SearchIndex);
if SearchIndex < 0 then
Exit;
Result += [SearchIndex];
SearchIndex += substr.Length;
end;
end;
{$ModeSwitch advancedrecords}
uses
SysUtils;
type
TFindIterator = record
private
SearchPos: SizeInt;
SearchString: String;
DataString: String;
public
function MoveNext: Boolean; inline;
property Current: SizeInt read SearchPos;
function GetEnumerator: TFindIterator;
end;
function TFindIterator.MoveNext: Boolean;
begin
if SearchPos<0 then
SearchPos := 0
else
SearchPos += SearchString.Length;
SearchPos := DataString.IndexOf(SearchString, SearchPos);
Result := SearchPos >= 0;
end;
function TFindIterator.GetEnumerator: TFindIterator;
begin
Result := Self;
end;
function FindStrings(const substr, s: String): TFindIterator;
begin
Result.SearchPos:=-1;
Result.SearchString:=substr;
Result.DataString:=s;
end;
var
i: Integer;
begin
for i in FindStrings('--', '123--23--45--123') do
WriteLn(i);
end.
In Assembler ginge auch vieles nicht ohne JMP oder ähnliches und viele Hochsprachen Features sind letztlich als irgendwie geartete Sprünge implementiert (Schleifen, Bedingungen, etc.).