Fehler in ReplaceString
Verfasst: 13.01.2015 14:39
In einem seltenen Fall funktioniert ReplaceString() nicht richtig. Angenommen, man will jeweils zwei aufeinanderfolgende Leerzeichen durch ein einziges Leerzeichen ersetzen, so werden 3 aufeinanderfolgende Leerzeichen nicht korrekt ins nur eins umgewandelt.
Offensichtlich wird folgendes Verfahren angewandt: Zunächst wird das erste Auftreten von " " (2Leerzeichen") gesucht und durch ein einzelnes Leerzeichen ersetzt.Wenn das doppelte Leerzeichen an der Stelle k im String beginnt, wird anschließend nach weiteren Leerzeichen ab der Stelle k+2 [allgemeiner k+Länge(Findstring) ] weitergesucht. Richtig aber wäre eine weitere Suche ab der Stelle k+1 bzw. allgemeiner k+länge(Ersatzstring). Der Fehler tritt immer dann auf, wenn der Suchstring eine geringere Länge als der Ersatzstring hat und gleichartige Zeichen aufeinanderfolgen.
Der Fehler fällt in anderen als dem geschildertem Fall nicht auf. Würde die folgende Suche bei k+länge(Ersatzstring) beginnen, wäre auch im geschilderten Fall das Ergebnis korrekt und bisherige Fälle funktionierten weiterhin. Es würde lediglich eine etwas geringere Geschwindigkeit vorliegen, da pro Auftreten jeweils 1 Zeichen mehr untersucht werden müsste.
Der geschilderte Fall ist übrigens wichtig bei der Aufsplittung eines String mit Leerzeichen als Trennzeichen. Wenn dort mehrere Leerzeichen aufeinanderfolgen, will man das auf ein einzelnes reduziert haben.
Natürlich kann man das gewünschte Verhalten mit Findstring und Replacestring bzw. durch wiederholten Aufruf von Replacestring() nachbilden. Viel einfacher aber wäre die geschilderte Änderung in der Codierung von ReplaceString().
Code: Alles auswählen
EnableExplicit
;Ersetze 2 oder mehr Leerzeichen durch ein einziges
Define Teststring.s,k.i
Teststring="Hallo, String mit vielen Leerzeichen *"
Teststring=ReplaceString(Teststring," "," ")
MessageRequester("wrong",Teststring)
Der Fehler fällt in anderen als dem geschildertem Fall nicht auf. Würde die folgende Suche bei k+länge(Ersatzstring) beginnen, wäre auch im geschilderten Fall das Ergebnis korrekt und bisherige Fälle funktionierten weiterhin. Es würde lediglich eine etwas geringere Geschwindigkeit vorliegen, da pro Auftreten jeweils 1 Zeichen mehr untersucht werden müsste.
Der geschilderte Fall ist übrigens wichtig bei der Aufsplittung eines String mit Leerzeichen als Trennzeichen. Wenn dort mehrere Leerzeichen aufeinanderfolgen, will man das auf ein einzelnes reduziert haben.
Natürlich kann man das gewünschte Verhalten mit Findstring und Replacestring bzw. durch wiederholten Aufruf von Replacestring() nachbilden. Viel einfacher aber wäre die geschilderte Änderung in der Codierung von ReplaceString().