Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie entferne ich Steuerzeichen aus einem String? (https://www.delphipraxis.net/184598-wie-entferne-ich-steuerzeichen-aus-einem-string.html)

Der schöne Günther 8. Apr 2015 18:31

Delphi-Version: XE7

Wie entferne ich Steuerzeichen aus einem String?
 
Hallo, mein Name ist Günther und ich programmiere nun seit etwas über zwei Jahren in Delphi. Heute stehe ich vor einem schwierigen Problem. Ich möchte bestimmte Character (wie
Delphi-Quellcode:
#0
) aus einem String entfernen.

Ich dachte, ich mache es so:
Delphi-Quellcode:
uses System.SysUtils;

procedure justReplaceThings();
const
   STX = #02;
   ETX = #03;
   NUL = #00;

   myStr   =   'X'+STX+'Hallo '+NUL+'Welt'+ETX;
var
   cleanedStr:   String;
begin
   cleanedStr := myStr.Replace(NUL, EmptyStr);
   Assert( cleanedStr <> myStr );
end;
Aber leider funktioniert das nicht, da kommt so eine komische Fehlermeldung. Könnt ihr mir helfen? Ist bestimmt voll einfach, aber ich bin noch neu :oops:

himitsu 8. Apr 2015 18:40

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Komisch?

Man mag es nicht glauben, aber Strg+C funktioniert auch in Delphi-Dialogen. (und dann Strg+V als Text ins Forum)
Du meinst aber nicht zufällig sowas, wie Folgendes? :stupid:
Zitat:

---------------------------
Project3
---------------------------
Assertion fehlgeschlagen (C:\Users\Frank\Documents\Embarcadero\Studio\Proje kte\Unit3.pas, Zeile 36)
---------------------------
OK
---------------------------



Die Frage könnte aber auch lauten: "Wie kommen denn böse Steuerzeichen in den String rein"?

EWeiss 8. Apr 2015 18:43

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Zitat:

Die Frage könnte aber auch lauten: "Wie kommen denn böse Steuerzeichen in den String rein"?
In dem man sie absichtlich einbaut ?

LOL ;)

gruss

Der schöne Günther 8. Apr 2015 18:45

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Wie da hineinkommen weiß ich auch nicht, der entsprechende Programmierer ist schon nach Hause gegangen. Kann ich bei dem Wetter auch verstehen.

Die eigentliche Frage Warum werden die Zeichen nicht entfernt? bleibt aber bestehen. Steppe ich durch den entsprechenden RTL-Code verlässt mich spätestens bei
Delphi-Quellcode:
if (Str1[I] <> #0) and (StrLComp(PWideChar(PByte(Str1) + I * SizeOf(WideChar)), Str2, Len2) = 0) then
    begin
      Result := PWideChar(PByte(Str1) + I * SizeOf(WideChar));
die Lust...

himitsu 8. Apr 2015 18:53

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Sag das doch gleich. :zwinker:

Irgendwer ist vor Jahren auf die wirkich saublöde Idee gekommen und verwendet in StringReplace das Delphi-Referenz durchsuchenAnsiPos, welches im Windows wiederum das MSDN-Library durchsuchenStrPosLen (PChar) benutzt, anstatt Delphi-Referenz durchsuchenPos zu verwenden.

Jetzt rate mal, was der Unterschied zwischen einem Delphi-String mit Längenangabe und einem Windows-PChar mit Endezeichen ist und was dann passiert, wenn ein gewisses böses Steuerzeichen im String vor kommt. :angle:
Der Bug wurde schon vor sehr vielen Jahren gemeldet ... ich würde nicht mehr mit einem Bugfix rechnen.

Der schöne Günther 8. Apr 2015 18:58

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Das heißt mit allem außer #0 sollte es funktionieren?

Dejan Vu 8. Apr 2015 19:37

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Würde ich mal so annehmen. Auch absolute Neulinge können es übrigens ausprobieren. Aber dazu müssten sie Programmieren können. :lol:

Der schöne Günther 8. Apr 2015 19:44

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Delphi-Quellcode:
uses System.SysUtils;

procedure justReplacingThings();
const
   formatStr = 'Hallo%sWelt';
var
   dirtyString:   String;
   cleanedString:   String;
   badCharacter:   Char;
   charsTested:   Integer;
begin
   charsTested := 0;
   for badCharacter := Low(Char) to High(Char) do begin
      dirtyString := String.Format(formatStr, [badCharacter]);
      cleanedString := dirtyString.Replace(badCharacter, EmptyStr);
      if not (dirtyString <> cleanedString) then
         WriteLn('Removing Character #', Ord(badCharacter), ' failed');
      Inc(charsTested);
   end;

   WriteLn(charsTested, ' Characters tested');
end;
ergibt
Code:
Removing Character #0 failed
65536 Characters tested
Dann kann ich ja wieder ruhig schlafen.

Zacherl 9. Apr 2015 01:03

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Na zum Glück haben wir die Tage ja eine performante Funktion gebastelt, die beliebige Zeichen aus einem String entfernen kann:
http://www.delphipraxis.net/184473-s...ml#post1295287

Dejan Vu 9. Apr 2015 06:28

AW: Wie entferne ich Steuerzeichen aus einem String?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1296799)
Dann kann ich ja wieder ruhig schlafen.

Sicher? Ich hätte bei dem Test noch sichergestellt, das der 'badCharacter' auch wirklich im 'dirtyString' enthalten ist.
Könnte ja sein, das irgend ein Zeichen per 'Format' nicht übernommen wird. Dann meckert dein Code auch nicht.
Delphi-Quellcode:
procedure justReplacingThings();
const
   formatStr = 'Hallo%sWelt';
var
   dirtyString:  String;
   cleanedString:  String;
   badCharacter:  Char;
   charsTested:  Integer;
begin
   charsTested := 0;
   for badCharacter := Low(Char) to High(Char) do begin
      dirtyString := String.Format(formatStr, [badCharacter]);
      if not ContainsChar(dirtyString, badCharacter) then // <-----
        writeln('Format fails for #', ord(basCharacter))
      else begin
        cleanedString := dirtyString.Replace(badCharacter, EmptyStr);
        if not (dirtyString <> cleanedString) then
           WriteLn('Removing Character #', Ord(badCharacter), ' failed');
      end;
      Inc(charsTested);
   end;

   WriteLn(charsTested, ' Characters tested');
end;
Und dann 'ContainsChar' ohne API implementieren (d.h. kein POS o.ä.).


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz