Autor |
Beitrag |
XooL
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 13.01.07 16:59
Hi,
ich habe zur Zeit ein kleines Problem und zwar:
ich möchte einen String nach einem bestimmten Zeichen durchsuchen (z.B. '#') und einer Integervariablen übermitteln wir oft dieses Zeichen enthalten ist.
Hat jemand ne Idee ?
greez XooL
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 13.01.07 17:10
www.swissdelphicente...showcode.php?id=1326
Die erste Funktion macht etwas ähnliches, sie zerlegt einen String anhand eines Trennzeichens. Ich denke mal, du siehst daran, wie du das machen musst.
Das Array als ersten Parameter brauchst du ja gar nicht, weil du die einzelnen Teile des Strings nicht brauchst.
Alternativ (das wäre schneller) könntest du auch mit PosEx durch den String gehen. PosEx sucht ab einer bestimmten Position nach einem String in einem String, du kannst also hinter dem zuletzt gefundenen Zeichen weitersuchen.
|
|
XooL 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 13.01.07 17:23
Die Möglickeit mit PosEx scheidet aus, da dies in Delphi6 nicht vorhanden ist  ... trotzdem danke
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Sa 13.01.07 17:31
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 13.01.07 17:50
Nein, er hat schon Recht, PosEx gibts erst ab Delphi 7. Hätte im Profil die Delphi-Version gestanden, hätte ich es auch gar nicht erwähnt...
Aber mit Delete in der Schleife wie in dem verlinkten Beispiel gehts ja...
|
|
XooL 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 13.01.07 20:42
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 13.01.07 21:03
Erstens: Ich rate dringend von einem l als String-Variablen ab... Man verwechselt das leicht mit einer 1...
(Jedenfalls in der Quelltextformatierung  )
Außerdem: Warum rückst du erst so viel und dann fast gar nicht ein? Das macht es sehr unübersichtlich...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| zahl := 0; while not x do begin if pos('#', l) = 0 then begin x := true; end else begin zahl := zahl + 1; Delete(l, 1, Pos('#', l)); if Length(l) = 0 then x := true; end; end; |
Das erste Zeichen in einem String hat den Index 1. So löschst du also ein Zeichen zu wenig. (Vorausgesetzt es gibt keinen Fehler, aber das hättest du ja sicherlich dazugesagt.)
Das übrigbleibende Zeichen ist? Richtig, das Trennzeichen, also die Raute!
Naja, also bleibt es vor dem ersten hängen --> Endlosschleife...
Hier eine andere Version:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| zahl := 0; while (Length(l) > 0) and (Pos('#', l) > 0) do begin Inc(zahl); Delete(l, 1, Pos('#', l)); end; |
Beides ist ungetestet, sollte aber gehen...
|
|
Stinger47
      
Beiträge: 102
|
Verfasst: Sa 13.01.07 22:48
ich weiß nicht ob das problem schon gelöst ist aber ich hätte es eher so gelöst...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var Wort : String; Anzahl : Integer; i : Integer; begin
anzahl := 0;
for i := 1 to length(wort) do begin if (wort[i] = 'e') or (wort[i] = 'E') then anzahl := anzahl + 1; end; |
wenn du diese zeichen noch löschen möchtest die gefunden worden sind solltest du die schleife rückwärts zählen lassen, so dass er von hinten anfängt zu untersuchen und dann kannste die löschen sonst kann es sein das du ein zeichen auslässt da das nächste zeichen ja an die position des gelöschten ziechens rückt...
hoffe konnte dir helfen... 
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: So 14.01.07 00:48
Hallo,
dafür:
Delphi-Quelltext 1:
| if (wort[i] = 'e') or (wort[i] = 'E') then |
würde ich das nehmen:
Delphi-Quelltext 1:
| if UpCase(wort[i]) = UpCase('a') then |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 14.01.07 13:07
hier, ich habs mal schnell gecodet:
CountLetter 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function CountLetter(Word: String; Letter: Char): integer; begin Word:=AnsiLowerCase(Word); Letter:=AnsiLowerCase(Letter); Result:=0; if Letter<>'' then while Pos(Letter,Word)>0 do begin Result:=Result+1; Delete(Word,1,Pos(Letter,Word)+Length(Letter)); end; end; |
XION
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 14.01.07 14:05
Die Version mit dem Index ist auf alle Fälle vorzuziehen, da Zeichenkettenoperationen nicht sehr performant sind, da immer wieder Seicher alloziiert werden muss und die Zeichenkette umkopiert wird.
|
|
|