Autor Beitrag
Quake User
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



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

ausblenden 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 user profile iconraziel: "Color" durch "Delphi" ersetzt
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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. :wink:
Wenn das jemand etwas genauer erläutern kann, dann los.

Jedenfalls werden Stringoperationen mit "#0"-Zeichen zwangsläufig fehlerhaft ablaufen.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 31.01.06 10:00 
user profile iconjasocul hat folgendes geschrieben:
Jedenfalls werden Stringoperationen mit "#0"-Zeichen zwangsläufig fehlerhaft ablaufen.

Ist Poskeine Stringfunktion?

_________________
Na denn, dann. Bis dann, denn.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
GesuchtesZeichen :=#0;
NeuesZeichen := #13;{CR= Carriage Return}
For i := 1 to lenght(strTest) do
  if strTest[i] = GesuchtesZeichen then
     strTest[i] = NeuesZeichen;


Gruss Horst
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: Di 31.01.06 16:30 
Hallo,
user profile iconQuake 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



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

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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