Autor |
Beitrag |
Quake User
      
Beiträge: 159
|
Verfasst: Di 31.01.06 03:39
- Ich versuche in einem String die nicht darstellbaren Zeichen [CHR(0)] zu entfernen.
Das scheint nicht zu funktionieren. Tausche ich bspw. die 's' statt der #0, tritt der Fehler nicht auf
Delphi-Quelltext 1: 2:
| res:= IdUDPClient1.ReceiveString(); res:= StringReplace(res,#0,'/',[rfReplaceAll]); |
- StringReplace liefert leider auch keine Erfolgsmeldung!?
- Showmessage(IntToStr(pos(#0,res)));
liefert hingegen die korrekte Position der ersten #0
Moderiert von raziel: "Color" durch "Delphi" ersetzt
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 31.01.06 09:21
#0 gehört zu den "verbotenen" Zeichen. Es wird bei null-terminierten Strings als String-Ende-Markierung verwendet.
Soweit ich weiß, sind mittlerweile auch die Pascal-Strings null-terminiert. Nur für uns "alte Hasen" hat man das umbaut, damit wir nicht alle Programme umbauen müssen.
Wenn das jemand etwas genauer erläutern kann, dann los.
Jedenfalls werden Stringoperationen mit "#0"-Zeichen zwangsläufig fehlerhaft ablaufen.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 31.01.06 10:00
jasocul hat folgendes geschrieben: | Jedenfalls werden Stringoperationen mit "#0"-Zeichen zwangsläufig fehlerhaft ablaufen. |
Ist Poskeine Stringfunktion?
_________________ Na denn, dann. Bis dann, denn.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 31.01.06 10:32
@alzaimar:
Ja. Hast Recht.
Dann korrigiere ich mich: Stringoperationen können damit falsch ablaufen. Ich würde zumindest vorsichtig sein, wenn #0 im String enthalten ist und vorher prüfen, ob es keine Fehler gibt.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Di 31.01.06 12:00
hi!
ich hatte mal letztens in meinem String auch #0 Zeichen bis ich drauf kam, dass das Unicode war! Da wird es wohl schlecht mit umwandeln in einen "normalen" ANSI-String... (Also momentan geh ich zumindest davon aus, dass das Unicode war  ).
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Di 31.01.06 13:11
Hallo,
vielleicht solltest Du bei der Ersetzung von einem Zeichen durch ein anderes folgendes anwenden.Das ist nicht einmal langsam.
Delphi-Quelltext 1: 2: 3: 4: 5:
| GesuchtesZeichen :=#0; NeuesZeichen := #13; For i := 1 to lenght(strTest) do if strTest[i] = GesuchtesZeichen then strTest[i] = NeuesZeichen; |
Gruss Horst
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 31.01.06 16:30
Hallo,
Quake User hat folgendes geschrieben: | - Ich versuche in einem String die nicht darstellbaren Zeichen [CHR(0)] zu entfernen. |
willst du die Zeichen entfernen(löschen), dann:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function DelChar(s: String;c: Char): string; var z,i : Integer; begin i := 0; result := s; for z := 1 to Length(s) do if result[z] <> c then begin inc(i); result[i] := result[z]; end; setLength(result,i); end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Quake User 
      
Beiträge: 159
|
Verfasst: Di 31.01.06 17:48
Na ja - ich kann ein StringReplace natürlich auch "nachprogrammieren", ich sehe aber bis jetzt immer noch nicht ein, warum StringReplace das eben nicht tut aber bspw. Pos schon.
BTW: gibt es in der VCL etwas, das den String mit den Nullterminierten Teilstrings gleich zerlegt oder mus ich das selbst parsen?
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Di 31.01.06 17:59
Hallo,
wenn Du wie ich geschrieben habe die #0 durch #13 ersetzt und anschliessend.
memo1.lines.text := meinstring;//oder eine andere Stringliste
dann hast Du auch schon die einzelnen Zeilen.
Gruss Horst
|
|