AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi String mit Hilfe einer Schleife zerteilen und auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

String mit Hilfe einer Schleife zerteilen und auslesen

Ein Thema von cRayZo · begonnen am 30. Jul 2007 · letzter Beitrag vom 27. Aug 2007
Antwort Antwort
Seite 1 von 3  1 23      
cRayZo

Registriert seit: 30. Jul 2007
156 Beiträge
 
Delphi 6 Personal
 
#1

String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 30. Jul 2007, 18:12
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:
procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sende r: TObject);
Var
i,i2,i3,i4, Buffer, buchstabencount, Zahl1, Zahl2, Zahl3 : integer;
Buffer2, ZahlZufall1, ZahlZufall2, Speicher, x1, x2, x3:string;
begin
SPeicher:=Geheimcodetext.Text;
Zahlzufall1:=''; Zahlzufall2:=''; FOrm2.OriginalText.Text:=''; i2:=0; buchstabencount:=0;

for i:=0 to length(Geheimcodetext.text)do
if Geheimcodetext.Text[i]='|' then buchstabencount:=buchstabencount + 1 ;


for i2:=1 to buchstabencount do begin

i:=0;
x1:=(GetWordOfAnsiString1(SPeicher,1));
for i:=0 to length(x1)+1 do begin
delete(SPeicher,1,1); end;
i3:=0;
x2:=(GetWordOfAnsiString2(Speicher,1));
for i3:=0 to length(x3)+1 do begin
delete(SPeicher,1,1); end;
i4:=0;
x3:=(GetWordOfAnsiString3(SPeicher,1));
for i4:=0 to length(x3)+1 do begin
delete(SPeicher,1,1); end;

i:=0; SPeicher:='';

Zahl1:= strtoint(x1); Zahl2:= strtoint(x2); Zahl3:= strtoint(x3);
buffer:= (Zahl2-Zahl1);
buffer:= trunc(buffer/Zahl3);
x1:=''; x2:=''; x3:='';
showmessage(showmessage);
end;
end;
für das auslesen der Wörter hab ich als Funktion folgende benutzt:

Zitat:
Function GetWordOfAnsiString3(Text : string; WordPos : Word): string;
var
p : PChar;
begin
p := PChar(Text);
repeat
Dec(WordPos);
while p^ <> '|' do
begin
if WordPos = 0 then
Result := Result + p^;
Inc(p);
end;
if WordPos = 0 then Exit;
Inc(p);
until p^ = '|';
end;
Ich habe drei dieser Funktionen, jeh eine, die auf ein anderes Zeichen (also ; : | )als Wortende reagiert.
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 30. Jul 2007, 18:22
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 SplitstringSplitstring !
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
Andreas
  Mit Zitat antworten Zitat
cRayZo

Registriert seit: 30. Jul 2007
156 Beiträge
 
Delphi 6 Personal
 
#3

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 30. Jul 2007, 18:50
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 30. Jul 2007, 19:23
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
cRayZo

Registriert seit: 30. Jul 2007
156 Beiträge
 
Delphi 6 Personal
 
#5

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 3. Aug 2007, 02:39
Ja erscheint mir alles total logisch!! aber wenn ich das genauso mache behauptet der was von Zugriffsverletzung u so!

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!!
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#6

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 3. Aug 2007, 02:56
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;
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 3. Aug 2007, 07:10
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 3. Aug 2007, 08:04
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:
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;
Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#9

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 3. Aug 2007, 10:30
Zitat von SirThornberry:
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.
Uuups, sorry Wäre irgendein auch ein Fehler gewesen, den ich dir nicht zugetraut hätte, SirThornberry!
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
cRayZo

Registriert seit: 30. Jul 2007
156 Beiträge
 
Delphi 6 Personal
 
#10

Re: String mit Hilfe einer Schleife zerteilen und auslesen

  Alt 22. Aug 2007, 23:29
okay klappt alles soweit, vielen Dank nochmal.

ich hab jetzt weitergearbeitet, stoße jetzt aber auf den Fehler ungültige Gleitkommaoperation

Zitat:
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 TGeheimcodeForm.BitButtonEntschluesselnClick(Sende r: TObject);
var
numbers: TIntegerDynArray;
i,i2: Integer;
s: TStrings;
x, buffer2: string;
Zahl1, Zahl2, Zahl3: integer;
Zahl1count, Zahl2count, Zahl3count, buffer: integer;
begin
Form2.OriginalText.Text:='';
x:=GeheimcodeText.Text;

ExtractNumbers(x, numbers);
s := TStringList.Create;
for i := Low(numbers) to High(numbers) do
s.Add(IntToStr(numbers[i]));
showmessage(s.Text);
s.Free;

-------------------------------------------------------------------------------------------

Zahl1count:=0; Zahl2count:=1; Zahl3count:=2;

for i2:=1 to trunc(length(x)) do begin
Zahl1:=numbers[Zahl1count];
Zahl2:=numbers[Zahl2count];
Zahl3:=numbers[zahl3count];

buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);

//Zahlen in Zeichen konvertieren
if buffer=1 then Buffer2:='a' else if buffer=2 then Buffer2:='b' else if buffer=3 then Buffer2:='c' else
// usw...
if buffer=73 then Buffer2:='X' else if buffer=74 then Buffer2:='Y' else if buffer=75 then Buffer2:='Z' else
buffer2:='?';

Form2.OriginalText.Text:= Form2.OriginalText.Text + Buffer2;

Zahl1count:= Zahl1count+3;
Zahl2count:= Zahl2count+3;
Zahl3count:= Zahl3count+3;
end;
end;

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..
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 12:57 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