![]() |
String mit Hilfe einer Schleife zerteilen und auslesen
Hi ich hab ein Problem beim auslesen eines String. Ich hab hier schon gesuch, aber nichts gefunden.
Das Problem ist folgendes: ich möchte einen string auslesen, der in etwa so aussieht: Zahl;Zahl:Zahl|Zahl;Zahl:Zahl| und so weiter *Zahl* steht für eine beliebig große integer. jede Zahl ist unterschiedlich Hier ist der betreffende Teil des Quellcodes: Zitat:
Zitat:
In dem Quelltext oben wird (wenn es klappen würde) erst Zahl1 ausgelesen und in die Variable x1 eingespeichert, dann wird Zahl1 und Trennzeichen gelöscht. Das gleiche wird dann mit der zweiten und dritten gemacht. Die drei Zahlen werden dann verrechnet, und diese Zahl ausgegeben. Das wiederholt sich für die nächsten drei zahlen und so weiter. nur irgendwie klappt das nicht. entweder hat Delphi ein Problem mit den Trennzeichen und löscht es nicht (fehlermeldung: ;Zahl ist keine integer) oder es kommt eine Fehlermeldung in der nicht mehr als " steht könnt ihr mir helfen? Bittebitte :hello: |
Re: String mit Hilfe einer Schleife zerteilen und auslesen
Keine Ahnung, weshalb du 3 verschiedene Trennzeichen benutzen möchtest - das ist nicht üblich.
Aber sei's drum, die Strategie sieht so aus: Der String wird mit dem Trenner "|" in Einzelteile zerlegt und das Ergebnis in einer TStringList gespeichert. Dafür gibt es fertige Funktionen in der Code-Library ![]() Man sollte wirklich die erprobten Funktionen verwenden - Funktionen Marke Eigenbau haben meisten einige Fehler. Damit ist das Problem reduziert auf das Zerlegen von einfachen Strings dieser Bauart
Code:
Zahl;Zahl:Zahl
|
Re: String mit Hilfe einer Schleife zerteilen und auslesen
ja, okay, danke schonmal ;)
darauf bin ich gar nicht gekommen. Mit stringlist eig super idee aber das Hauptproblem ist ja eigentlich trotzdem geblieben. wie kann ich die drei Zahlen Zahl1;Zahl2:Zahl3 aus dem string jeweils in drei getrennte Variablen speichern? |
Re: String mit Hilfe einer Schleife zerteilen und auslesen
Delphi-Quellcode:
var
lCount: Integer; lMystr: String; lDsts : TStringList; lInt1, lInt2, lInt3 : Integer; begin lMystr := '5;7:9'; for lCount := 1 to Length(lMyStr) do if lMyStr[lCount] in [':', '|'] then lMyStr[lCount] := ';'; lDsts := TStringList.Create(); splitString(lMyStr, ';', lDsts); lInt1 := StrToInt(lDsts.Strings[0]); lInt2 := StrToInt(lDsts.Strings[1]); lInt3 := StrToInt(lDsts.Strings[2]); lDsts.Free; |
Re: String mit Hilfe einer Schleife zerteilen und auslesen
Ja erscheint mir alles total logisch!! aber wenn ich das genauso mache behauptet der was von Zugriffsverletzung u so! :wiejetzt:
Könntet ihr bitte mal alles in einen Quellcode schreiben, ich glaube darin liegt das Problem. also wie man einen String mit (von mir aus vereinfacht) Zahl1;Zahl2;Zahl3| in Variablen ausliest also je Zahl(1,2,3) eine Variable. Wär riesig nett von euch vielen Dank!! :hello: |
Re: String mit Hilfe einer Schleife zerteilen und auslesen
Delphi-Quellcode:
var
lCount: Integer; lMystr: String; lDsts : TStringList; lInt1, lInt2, lInt3 : Integer; begin lMystr := '5;7:9'; for lCount := 0 to Length(lMyStr)-1 do if lMyStr[lCount] in [':', '|'] then lMyStr[lCount] := ';'; lDsts := TStringList.Create(); splitString(lMyStr, ';', lDsts); lInt1 := StrToInt(lDsts.Strings[0]); lInt2 := StrToInt(lDsts.Strings[1]); lInt3 := StrToInt(lDsts.Strings[2]); lDsts.Free; |
Re: String mit Hilfe einer Schleife zerteilen und auslesen
:shock: Strings beginnen beim Index 1 und nicht bei 0!
Die Zugriffsverletzung muss an etwas anderem liegen. Ich hab es bei mir selbst probiert und es kam keine Zugriffsverletzung. Ich vermute es wurde die hälfte vergessen beim abschreiben. |
Re: String mit Hilfe einer Schleife zerteilen und auslesen
Herzlich willkommen in der Delphi-PRAXiS, cRayZo.
Du könntest die unterschiedlichen Trennzeichen auch dadurch behandeln, dass du deinen String als Liste natürlicher Zahlen betrachtest, die durch nicht-numerische Zeichen voneinander getrennt sind. Die Funktion ExtractNumbers() liefert dir die Zahlen in einem dynamischen Array zurück. Ein Umspeichern in andere Variablen ist eigentlich nicht unbedingt notwendig, da du auf die erste Zahl mit numbers[0] zugreifen kannst:
Delphi-Quellcode:
Freundliche Grüße vom marabu
uses
Types; // TIntegerDynArray procedure ExtractNumbers(const s: string; var ida: TIntegerDynArray); var i, n: Integer; isNum: Boolean; begin SetLength(ida, 0); n := 0; isNum := False; for i := 1 to Succ(Length(s)) do begin if (i > Length(s)) and not isNum then Break else isNum := s[i] in ['0'..'9']; if isNum then n := n * 10 + Ord(s[i]) - Ord('0') else begin SetLength(ida, Succ(Length(ida))); ida[High(ida)] := n; n := 0; end; end; end; procedure TDemoForm.ButtonClick(Sender: TObject); var numbers: TIntegerDynArray; i: Integer; s: TStrings; begin ExtractNumbers(Edit1.Text, numbers); s := TStringList.Create; for i := Low(numbers) to High(numbers) do s.Add(IntToStr(numbers[i])); ShowMessage(s.Text); s.Free; end; |
Re: String mit Hilfe einer Schleife zerteilen und auslesen
Zitat:
|
Re: String mit Hilfe einer Schleife zerteilen und auslesen
okay klappt alles soweit, vielen Dank nochmal.
ich hab jetzt weitergearbeitet, stoße jetzt aber auf den Fehler ungültige Gleitkommaoperation Zitat:
Der Fehler müsste unter der gestrichelten Linie sein. Die ersten, schät mal so 30 buchstaben wandelt er auch wieder völlig korrekt um, aber danach kommt eben der Fehler.. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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