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 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
Koller 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
NoTVerYEvilPzYchO 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, 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
Koller 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:
alzaimar 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]
alzaimar hat folgendes geschrieben: |
Nee, ich hab voll die Erkältung |
gute Besserung :wink: [/OT]
alzaimar - So 19.02.06 10:17
Lannes 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 > 0) And IsDigit (aString[q]) do Begin Result := aString[q] + Result; dec (q); End; End; |
Lannes 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,
alzaimar hat folgendes geschrieben: |
...
Nee, so doch auch nicht... Das Kommando ist doch nicht alles vor dem "#" |
Das Kommando
ist alles vor dem '#',
denn:
Koller 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. |
alzaimar 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
Lannes 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:
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);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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!