AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Anfang und Ende eines String teils ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Anfang und Ende eines String teils ermitteln

Ein Thema von jacky213 · begonnen am 3. Mär 2013 · letzter Beitrag vom 4. Mär 2013
Antwort Antwort
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#1

Anfang und Ende eines String teils ermitteln

  Alt 3. Mär 2013, 20:04
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:
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;
Zum Suchen des Wort Endes:
Delphi-Quellcode:
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;
Aber bei beiden funktionen kommt als Ergebnis immer eine ca. 7 stellige zahl und ich weis nicht
warum das so ist.
  Mit Zitat antworten Zitat
KWolf

Registriert seit: 22. Jun 2011
12 Beiträge
 
#2

AW: Anfang und Ende eines String teils ermitteln

  Alt 3. Mär 2013, 20:32
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:
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;
Gruß,
KWolf
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#3

AW: Anfang und Ende eines String teils ermitteln

  Alt 3. Mär 2013, 22:38
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
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#4

AW: Anfang und Ende eines String teils ermitteln

  Alt 4. Mär 2013, 00:05
So ich habe das Problem gelöst, war ein Logik Fehler von mir während des aufrufens der Funktion.

Ich habe folgendes gemacht:
showmessage(copy(str1, stringpartstart(str1, 16), stringpartend(str1,16)); Richtig müsste aber folgendermaßen sein:showmessage(copy(str1, stringpartstart(str1, 16), stringpartend(str1,16)-stringpartstart(str1, 16)); So bekomme ich im Klartext den richtigen copy Befehl um genau das richtige Wort zu kopieren.
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#5

AW: Anfang und Ende eines String teils ermitteln

  Alt 4. Mär 2013, 00:18
Hallo,

Zitat:
Aber bei beiden funktionen kommt als Ergebnis immer eine ca. 7 stellige zahl und ich weis nicht warum das so ist.
Immer glaube ich jetzt nicht. Wenn man die beiden Funktion mit dem Startwert 16 laufen lässt, denn kommen - wie KWolf bereits anmerkte - korrekte Werte raus. Mit dem Startwert 41 verhält es sich allerding nicht so. Warum? Es ist das letzte Wort in Deinem Teststring, und da kommt halt dann kein Leerzeichen mehr; aber Du suchst fröhlich über die Stringgrenzen hinaus weiter, solange bis dann halt zufällig mal im Speicher ein Leerzeichen auftaucht. Gleiches gilt für einen Startwert der im ersten Wort liegt.

Zitat:
So ich habe das Problem gelöst, war ein Logik Fehler von mir während des aufrufens der Funktion.
Galube ich nicht. Siehe oben.


Du kannst ja mal folgendes versuchen:
Delphi-Quellcode:
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.
und in Deinem Form
Delphi-Quellcode:
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;
Gruß
Volker Zeller

Geändert von Volker Z. ( 4. Mär 2013 um 00:20 Uhr)
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#6

AW: Anfang und Ende eines String teils ermitteln

  Alt 4. Mär 2013, 09:08
stimmt auch

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
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#7

AW: Anfang und Ende eines String teils ermitteln

  Alt 4. Mär 2013, 09:29
Der Übersicht halber hier nun das Endergebnis:

Die Komplette Unit mit Aufruf:
Delphi-Quellcode:
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.
Und hier nun der Aufruf:
Delphi-Quellcode:
procedure TForm1.Button15Click(Sender: TObject);
var
s: string;
begin
S:= 'Das ist der String den ich testen möchte';
showmessage(CopyWord(S, 15));
end;
Die Ausgabe ist in diesem Fall dann:
String

Danke nochmal an Volker Z. und KWolf

Geändert von jacky213 ( 4. Mär 2013 um 09:35 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz