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
Mathias hat geschrieben: Di 19. Mär 2024, 08:22
Ich war gestern wohl ein bisschen müde, es geht sehr einfach,
Vor allem war/ist deine Frage/Titel komplett irreführend.
Du suchst nach Char nicht nach Substring. "Pos" hat damit nichts zu tun.
Jorg3000 hat geschrieben: Di 19. Mär 2024, 07:17
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.
kirchfritz hat geschrieben: Di 19. Mär 2024, 06:56
Ich dachte "GOTO" ist verpönt und sollte heutzutage nicht mehr verwendet werden, wenn ich mich nicht irre?
marcov hat in einer anderen Diskussion dazu gesagt:
Man darf GOTO nutzen - man muss aber einen Aufsatz von einer A4-Seite Länge schreiben, warum es an dieser Stelle unbedingt nötig ist.
Mit dieser Nebenbedingung kann man aus meiner Sicht dann auch GOTO einsetzen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
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.
Mathias hat geschrieben: Di 19. Mär 2024, 08:25
Auch in Assembler findet man es viel als "jmp".
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.).