Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - String bis zu einem Zeichen auslesen


Marco D. - Sa 18.02.06 20:47
Titel: String bis zu einem Zeichen auslesen
Hallo ich habe den String 's'. So, nun will ich prüfen, ob die Zeichen bis zu einem '#' in s '13' sind.

Also: wenn alle zeichen von s bis zu '#' gleich '13' dann tue irgendwas.

Welche Funktion muss ich nehmen? (hab es schon mit copy probiert)


Marc. - Sa 18.02.06 20:55

wie wärs mit pos('#',s) ?


Born-to-Frag - Sa 18.02.06 20:55

ein Zeichen kann doch nicht '13' sein :rofl:
Irgendwie versteh ich da was nicht :gruebel:


greetz


Marc. - Sa 18.02.06 20:56

ich dachte er meinte die anzahl der zeichen :lol:


Born-to-Frag - Sa 18.02.06 20:59

Kann auch sein.. dann würd ich einfach if  s[14] = '#' then //machwas nehmen


Lannes - Sa 18.02.06 21:04

Hallo,
und wenn der String so aussieht?

Delphi-Quelltext
1:
s :=  'abcde#wertert#';                    

dann besser so:

Delphi-Quelltext
1:
2:
if Pos('#',s) = 14 then  
  showmessage('vor "#" sind 13 Zeichen');


Born-to-Frag - Sa 18.02.06 21:06

Genaugenommen ist aber # doch auch ein Zeichen :nut: ^^


Marco D. - Sa 18.02.06 21:09

Sorry Jungs - meine Schuld

Es sollen aus s alle Zeichen ausgelesen werde, die sich vor dem '#' befinden. Das mit der 13 ist unnütz :autsch:


Marco D. - Sa 18.02.06 21:12

Ich meinte das so:
auslesen alle Zeichen von s vor der Raute.
Dann prüfen ob dieser ausgelesene String gleich '13' ist. Also keine Zahl - '13' als String.
Und wenns so ist, dann machwas. Ich weiß nur nich, wie man das ausliest. Ich muss jetzt essen, dann probier ichs mal mit pos.


alzaimar - Sa 18.02.06 21:18

user profile iconKoller hat folgendes geschrieben:
.... Ich muss jetzt essen, dann probier ichs mal mit pos.

Eine gute Idee. Und dann noch "pos" und zwei Vergleiche oder "copy" und ein Vergleich...


Marc. - Sa 18.02.06 21:22


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var i: integer;
    s,Text: string;
begin
 i := pos('#',Text);
 s := copy(Text,0,i-1);

If s = '13' then ...


(ungetestet)


alzaimar - Sa 18.02.06 21:26

user profile iconNoTVerYEvilPzYchO hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var i: integer;
    s,Text: string;
begin
 i := pos('#',Text);
 s := copy(Text,0,i-1);

If s = '13' then ...


(ungetestet)

Das merkt man ...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var i: integer;
    s,Text: string;
begin
 i := pos('#',Text);
 If i=0 Then Raise Exception.Create('"#" kommt im Text nicht vor');
 // s := copy(Text,0,i-1); // Stringindizes sind 1-basiert. Und er will doch prüfen, ob *NACH* dem # eine 13 steht
 s := Copy (Text, i+1,2);
 If s = '13' then ...

Oder noch einfacher:

Delphi-Quelltext
1:
If Pos ('#13',Text)<>0 Then ...                    

Wenn man nur wissen woll, ob nach dem # eine 13 kommt. Mich dünkt, er will nach CR (carriage return, #13) prüfen...


Marc. - Sa 18.02.06 21:30

user profile iconKoller hat folgendes geschrieben:

auslesen alle Zeichen von s vor der Raute.
Dann prüfen ob dieser ausgelesene String gleich '13' ist. Also keine Zahl - '13' als String.


mhm.. ich dachte er meinte "13" vor der raute :roll:

user profile iconalzaimar hat folgendes geschrieben:
If i=0 Then Raise Exception.Create('"#" kommt im Text nicht vor');


Warum eine exception auslösen? ich würds mit showmessage machen :roll:


alzaimar - Sa 18.02.06 21:52

Mann o mann, ick werd alt. Nee, ich hab voll die Erkältung, die offensichtlich vor meinem Hirn nicht haltmacht.
Vor, klar. Peinlich. Egal.

Selbst dann deine Lösung nicht ganz korrekt (aber wenigstens verstehe ich sie dann).
Aber erstmal die Exception erklären: Die bricht, im Gegensatz zu einem Showmessage, die Programmausführung ab. Und die Routine darf dann nicht weiter machen. Die Exception kann man ohne Problem im Aufruf abfangen. Das ist imho legaler Programmierstil.

So. 13 VOR der Raute. Direkt davor? Egal:
Direkt davor?

Delphi-Quelltext
1:
If Pos ('13#', Text)>0 Then ...                    

Nicht direkt davor?

Delphi-Quelltext
1:
2:
3:
4:
5:
p := Pos ('#', Text);
If p=0 then ....
For i:=1 to p-2 do
  if Copy (Text, i,2)='13' Then  
    ShowMessage ('Irgendwo vor der Raute gibts eine 13');


Marco D. - Sa 18.02.06 22:01

Was ich machen will:
Es werden per Sockets Strings gesendet. Es gibt verschiedene Befehle. (1=reboot; 2=shutdown .. 10=changebackground) Es wird folgendes egsendet: '13#dateipfad'.
Und nun muss ich in der Prüfprozedur, die diesen String zerpflückt, prüfen, was vor der Raute steht, um den Befehl zu kenn.


alzaimar - Sa 18.02.06 22:07

Aha. Dann so:

Delphi-Quelltext
1:
2:
p := Pos ('#', Text);
Cmd := Copy (Text,p-2,2);

(Ohne Fehlerprüfung)


Lannes - Sa 18.02.06 22:35

Hallo,
funktioniert aber nur wenn die Zahl vor '#' 2-stellig ist,
besser so:

Delphi-Quelltext
1:
2:
p := Pos ('#', Text);  
Cmd := Copy (Text,1,p-1);


[OT]
user profile iconalzaimar hat folgendes geschrieben:
Nee, ich hab voll die Erkältung
gute Besserung :wink: [/OT]


alzaimar - So 19.02.06 10:17

user profile iconLannes hat folgendes geschrieben:
Hallo,
funktioniert aber nur wenn die Zahl vor '#' 2-stellig ist,
besser so:

Delphi-Quelltext
1:
2:
p := Pos ('#', Text);  
Cmd := Copy (Text,1,p-1);


Nee, so doch auch nicht... Das Kommando ist doch nicht alles vor dem "#" . Is doch echt geil, wie man sich an so einem Problem totcoden kann :oops:

Also, jetz mal der offizielle Kommando-Vor-Der-Raute-Extrakt-o-mat. Ich sammle alle Ziffern VOR der Raute ein:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Function TheCommandInFrontOfTheHash(Const aString : String) : String;
Var
  p,q,r : Integer;

Begin
  p := Pos('#',aString);
  If p=0 Then
    Raise Exception.Create('Keine Raute im String');
  q := p - 1;
  Result := '';
  While (q > 0And IsDigit (aString[q]) do Begin
    Result := aString[q] + Result;
    dec (q);
    End;
End;    
// Falls IsDigit unbekannt ist, dann durch "(aString[q] in ['0'..'9'])" ersetzen

user profile iconLannes hat folgendes geschrieben:

[OT]
...gute Besserung :wink: [/OT]

Danke, kanns gebrauchen :eyes:

Was lehrt uns das:
1. Kommandos möglichst uniform (also feste Zeichenlänge).
2. Das Kommando-Escape-Zeichen ('#') VOR die Kommandos setzen.

Dann reduziert sich o.g. Code gewaltig.


Lannes - So 19.02.06 14:06

Hallo,
user profile iconalzaimar hat folgendes geschrieben:
...
Nee, so doch auch nicht... Das Kommando ist doch nicht alles vor dem "#"
Das Kommando ist alles vor dem '#',
denn:
user profile iconKoller hat folgendes geschrieben:
Ich meinte das so:
auslesen alle Zeichen von s vor der Raute.
Dann prüfen ob dieser ausgelesene String gleich '13' ist.


user profile iconalzaimar hat folgendes geschrieben:
Is doch echt geil, wie man sich an so einem Problem totcoden kann
finde ich auch.
Fazit: Mit der Qualität/Eindeutigkeit der Frage steigt die Qualität/Eindeutigkeit der Antwort :angel:


Marco D. - So 19.02.06 14:10

Jo das stimmt :D
Ich hab mich aber auch dumm ausgedrückt, das gebe ich zu.
Es ist richtig, dass ich im Grunde aus dem String s einfach alle Zeichen extrahieren möchte.
Hier stehen so viele Postings - welches ist nun richtig?


Lannes - So 19.02.06 14:23

Hallo,

angenommen der String ist '13#dateipfad'.
Möchtest Du als Ergebnisse das Folgende haben?
Kommando = '13'
Argument = 'dateipfad'


Amateur - So 19.02.06 15:00

nur mal wegen dem der code klappt nicht wenn das kommando einstellig ist. da würde ich einfach ne 0 vorschreiben und dann den code mit dem copy(text,p-2-2) nehmen


Marco D. - So 19.02.06 15:06

user profile iconLannes hat folgendes geschrieben:
Hallo,

angenommen der String ist '13#dateipfad'.
Möchtest Du als Ergebnisse das Folgende haben?
Kommando = '13'
Argument = 'dateipfad'

:D Genau richtig :party:


Lannes - Mo 20.02.06 00:27

Hallo,

1. mit Pos kannst Du feststellen wo das Zeichen '#' im String auftritt
2. mit Copy kannst Du die Zeichen bis zum '#' auslesen
3. mit Copy kannst Du die Zeichen hinter dem '#' auslesen

Punkt 1. u. 2. findest Du an dieser Stelle [http://www.delphi-forum.de/viewtopic.php?p=336177&sid=0f786d8d847c6fc3b76dd8c7e6f19480#336177] in diesem Thread.
Punkt 3. müsste dann eigentlich von Dir mit einer Befragung der Delphi-Hilfe und einer Suche hier im Forum lösbar sein, oder :?


Horst_H - Mo 20.02.06 09:59

Hallo,

@Koller:
Warum schickst Du nicht einfach eine Stringliste als Commatext.
Der erste String ist immer der Befehl und die folgenden(fast beliebgig viele), eben die Parameter dazu.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
BefehlsStrListe.clear;
BefehlsStrListe.Lines.Add(BefehlsString);//z.B.'01' oder 'ShutDown'
n := BestimmeParameterZahl;
For i := 1 to n do
  BefehlsStrListe.Lines.Add(Parameter[n]);
Send(BefehlsStrListe.Commatext);

Den BefehlsString kannst Du bei Empfang in einer BefehlsListe finden(auch per Hash, wenn Du lesbare Befehle wie 'ShutDown' nutzt )und mit einer Funktion verknuepfen.

Gruss Horst