Autor Beitrag
XooL
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 13.01.07 17:23 
Die Möglickeit mit PosEx scheidet aus, da dies in Delphi6 nicht vorhanden ist :( ... trotzdem danke
Dunkel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: Sa 13.01.07 17:31 
user profile iconXooL hat folgendes geschrieben:
Die Möglickeit mit PosEx scheidet aus, da dies in Delphi6 nicht vorhanden ist :( ... trotzdem danke

Hast Du auch folgendes gemacht?
ausblenden Delphi-Quelltext
1:
2:
uses
..., StrUtils ,...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 13.01.07 20:42 
ich hab mal was ausprobiert, aber es funktioniert noch nicht ganz einwandfrei, vllt. sieht ja einer von euch meinen fehler:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
while x = false do
begin
if pos('#',l)=0 then         //wenn er nichts findet ist der Wert=0
                 begin
                  x:=true;
                 end
                else
                 begin
                  zahl:=zahl+1;
                  Delete(l,0, pos('#',l));
                  if length(l)=0 then x:=true;
                 end;
end;


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
zahl := 0// wichtig! erst initialisieren!
while not x do // nicht x, also x = false ;-)
begin 
  if pos('#', l) = 0 then //wenn er nichts findet ist der Wert=0
  begin 
    x := true; 
  end 
  else 
  begin 
    zahl := zahl + 1;
    Delete(l, 1, Pos('#', l)); // Wenn du von Null aus löschst, dann ist das falsch (s.u.)
    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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
zahl := 0// wichtig! erst initialisieren!
while (Length(l) > 0and (Pos('#', l) > 0do 
  // Solange noch eine Raute gefunden wird und noch was in l drin ist
begin
  Inc(zahl); // Inkrementiert zahl, also erhöht zahl um eins
  Delete(l, 1, Pos('#', l)); // Wenn du von Null aus löschst, dann ist das falsch (s.u.)
end;

Beides ist ungetestet, sollte aber gehen...
Stinger47
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: 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...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  Wort    :  String;    // da kommt halt der zu untersuchende string rein...
  Anzahl  :  Integer;   // die anzahl des zeichens...
  i       :  Integer;   // laufvariable für die schleife
  
begin

 anzahl  :=  0

 for i := 1 to length(wort) do                      // hier wir geschaut wie lang der string ist und dann jedes einzelne zeichen überprüft
   begin
     if (wort[i] = 'e'or (wort[i] = 'E'then     // wenn das i-te zeichen ein e ist (du kannst auch ne variable machen und dann halt nach dem zeichen
       anzahl  :=  anzahl + 1;                      // suchen was du möchtest) dann soll anzahl um einen erhöht werden....wichtig ist das du bei buchstaben
   end;                                             // zwischen groß und kleinbuchstaben differenzierst...die zahl kannste dann ja in nem label ausgeben oder
                                                    // so


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 14.01.07 00:48 
Hallo,

dafür:
ausblenden Delphi-Quelltext
1:
if (wort[i] = 'e'or (wort[i] = 'E'then					

würde ich das nehmen:
ausblenden Delphi-Quelltext
1:
if UpCase(wort[i]) = UpCase('a'then					

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 14.01.07 13:07 
hier, ich habs mal schnell gecodet:

ausblenden CountLetter
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function CountLetter(Word: String; Letter: Char): integer; 
//wenn du auch mehrere Buchstaben suchen  
//willst (also z.B. "Blub") dann musst aus dem Char einfach String machen
begin
 Word:=AnsiLowerCase(Word); //AnsiLowerCase funzt auch bei Ä usw.
 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



BeitragVerfasst: 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.