![]() |
Anfang und Ende eines String teils ermitteln
Hallo, wie die Überschrift schon sagt, hatte ich vor einen Teil eines Strings in einem String zu suchen
und dessen Anfang und Ende zu ermitteln. Beispiel String:= 'Das ist der String den ich untersuchen möchte'; Ich möchte nun von der Position 16 ab den Anfang und das ende vom entsprechenden Wort ermitteln. Wenn alles richtig läuft dann sollte der Anfang und das Ende vom Wort String ermittelt werden. Hierzu habe ich folgende funktoonen geschrieben aber die Rückgabewerte stimmen einfach nicht und ich weis nicht warum. Zum Suchen des Wort Anfang:
Delphi-Quellcode:
Zum Suchen des Wort Endes:
function StringPartStart (str:string; start:integer) : integer;
var found: boolean; begin found:=false; while found=false do begin if Copy(Str, start, 1)=' ' then found:=true; start:= start -1; end; Result:= Start + 2; end;
Delphi-Quellcode:
Aber bei beiden funktionen kommt als Ergebnis immer eine ca. 7 stellige zahl und ich weis nicht
function StringPartEnd (str:string; start:integer) : integer;
var found: boolean; begin found:=false; while found=false do begin if Copy(Str, start, 1)=' ' then found:=true; start:= start +1; end; Result := Start - 2; end; warum das so ist. |
AW: Anfang und Ende eines String teils ermitteln
Hallo jacky213,
ich habe deine beiden Funktionen eben mal getestet und bei mir kommen die korrekten Werte raus. StringPartEnd liefert mir 18 und StringPartStart liefert mir 13. Ich denke mal dies ist das was du haben wolltest. Dein Problem wird wohl an anderer Stelle liegen. Vieleicht postest du mal die die Stelle deines Programms an der du deine Funktionen aufrufst? Folgendermaßen könntest du es ja machen:
Delphi-Quellcode:
Gruß,
function StringPartStart(str:string; start:integer) : integer;
var found: boolean; begin found := false; while found = false do begin if Copy(Str, start, 1) = ' ' then found := true; start := start -1; end; Result:= Start + 2; end; function StringPartEnd(str:string; start:integer) : integer; var found: boolean; begin found := false; while found = false do begin if Copy(Str, start, 1) = ' ' then found := true; start := start +1; end; Result := Start - 2; end; procedure TForm1.Button1Click(Sender: TObject); var lString : String; begin lString:= 'Das ist der String den ich untersuchen möchte'; Label1.Caption := IntToStr(StringPartStart(lString, 16)); Label2.Caption := IntToStr(StringPartEnd(lString, 16)); end; KWolf |
AW: Anfang und Ende eines String teils ermitteln
das hab ich schon gemacht ich verstehe das auch nicht, eigentlich total unlogisch. ich habe extra eine unit geschrieben und es stehen nur diese funktionen drin. Habe diese Unit in Form1 eingebunden und spreche die funktionen von dort aus an.
ich habe auch schon direkt von der unit aus die ausgabe der funktion während sie läuft geprüft aber es bring nichts |
AW: Anfang und Ende eines String teils ermitteln
So ich habe das Problem gelöst, war ein Logik Fehler von mir während des aufrufens der Funktion.
Ich habe folgendes gemacht:
Delphi-Quellcode:
Richtig müsste aber folgendermaßen sein:
showmessage(copy(str1, stringpartstart(str1, 16), stringpartend(str1,16));
Delphi-Quellcode:
So bekomme ich im Klartext den richtigen copy Befehl um genau das richtige Wort zu kopieren.
showmessage(copy(str1, stringpartstart(str1, 16), stringpartend(str1,16)-stringpartstart(str1, 16));
|
AW: Anfang und Ende eines String teils ermitteln
Hallo,
Zitat:
Zitat:
Du kannst ja mal folgendes versuchen:
Delphi-Quellcode:
und in Deinem Form
unit Unit2;
interface function StringPartEnd (const Str : string; const Start : Integer) : Integer; function StringPartStart (const Str : string; const Start : Integer) : Integer; implementation function CheckStartInRange (const Str : string; const Start : Integer) : Integer; begin if (Start < 1) or (Length (Str) < Start) then Result := 0 else Result := Start end; function IsWhitespace (const Str : string; const Start : Integer) : Boolean; begin Result := CharInSet (Str [Start], [#9, #10, #13, #32]) end; function StringPartStart (const Str : string; const Start : Integer) : Integer; begin Result := CheckStartInRange (Str, Start); if Result = 0 then Exit; if IsWhitespace (Str, Result) then Exit; while (Result > 1) and (Str [Result - 1] <> ' ') do Dec (Result) end; function StringPartEnd (const Str : string; const Start : Integer) : Integer; var l : Integer; begin Result := CheckStartInRange (Str, Start); if Result = 0 then Exit; if IsWhitespace (Str, Result) then Exit; l := Length (Str); while (Result < l) and (Str [Result + 1] <> ' ') do Inc (Result) end; end.
Delphi-Quellcode:
Gruß
procedure TForm1.Button1Click(Sender: TObject);
var s : string; i, j : Integer; begin s := 'Das ist der String den ich untersuchen möchte'; i := StringPartStart (s, 41); j := StringPartEnd (s, 41); Memo1.Lines.Add (Format ('%d %d %s', [i, j, Copy (s, i, j - i + 1)])); //Ausgabe 40 45 möchte i := StringPartStart (s, 2); j := StringPartEnd (s, 2); Memo1.Lines.Add (Format ('%d %d %s', [i, j, Copy (s, i, j - i + 1)])); // Ausgabe 1 3 Das i := StringPartStart (s, 16); j := StringPartEnd (s, 16); Memo1.Lines.Add (Format ('%d %d %s', [i, j, Copy (s, i, j - i + 1)])); // Ausgabe 13 18 String i := StringPartStart (s, 4); j := StringPartEnd (s, 4); Memo1.Lines.Add (Format ('%d %d %s', [i, j, Copy (s, i, j - i + 1)])); // Ausgabe 4 4 end; |
AW: Anfang und Ende eines String teils ermitteln
stimmt auch :D
man könnte aber auch vorher die länge des strings prüfen und nach dem letzten leerzeichen vor dem letzten wort, sollte die angegebene zahl schon zu weit gehen dann fehlermeldung und exit würd ich sagen. ich hab gestern noch ein paar stunden dran gehängt und mir ist natürlich in dem moment wo ich gemütlich im bett lag das problem mit der suche nach dem string ende hinaus eingefallen. habt dank und schönen wochenstart |
AW: Anfang und Ende eines String teils ermitteln
Der Übersicht halber hier nun das Endergebnis:
Die Komplette Unit mit Aufruf:
Delphi-Quellcode:
Und hier nun der Aufruf:
unit StringChecker;
interface function StringPartEnd (const Str : string; const Start : Integer) : Integer; function StringPartStart (const Str : string; const Start : Integer) : Integer; function CopyWord(Text: String; Position: integer) : String; implementation uses unit1, SysUtils; function CheckStartInRange (const Str : string; const Start : Integer) : Integer; begin if (Start < 1) or (Length (Str) < Start) then Result := 0 else Result := Start end; function IsWhitespace (const Str : string; const Start : Integer) : Boolean; begin Result := CharInSet (Str [Start], [#9, #10, #13, #32]) end; function StringPartStart (const Str : string; const Start : Integer) : Integer; begin Result := CheckStartInRange (Str, Start); if Result = 0 then Exit; if IsWhitespace (Str, Result) then Exit; while (Result > 1) and (Str [Result - 1] <> ' ') do Dec (Result) end; function StringPartEnd (const Str : string; const Start : Integer) : Integer; var l : Integer; begin Result := CheckStartInRange (Str, Start); if Result = 0 then Exit; if IsWhitespace (Str, Result) then Exit; l := Length (Str); while (Result < l) and (Str [Result + 1] <> ' ') do Inc (Result) end; function CopyWord(Text: String; Position: integer) : String; var i, j: integer; begin i := StringPartStart (Text, Position); j := StringPartEnd (Text, Position); Result := Copy (Text, i, j - i + 1); end; end.
Delphi-Quellcode:
Die Ausgabe ist in diesem Fall dann:
procedure TForm1.Button15Click(Sender: TObject);
var s: string; begin S:= 'Das ist der String den ich testen möchte'; showmessage(CopyWord(S, 15)); end;
Delphi-Quellcode:
String
Danke nochmal an Volker Z. und KWolf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz