AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Doppelte Zeichen löschen

Ein Thema von Pseudemys Nelsoni · begonnen am 10. Mai 2005 · letzter Beitrag vom 10. Mai 2005
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Doppelte Zeichen löschen

  Alt 10. Mai 2005, 16:03
Moin,

Nehmen wir mal an ich habe folgenden String:

Zitat:
...blah...blubb..irgendwas..
und ich möchte eine Funktion schreiben, die doppelte "." löscht und die aussen auch...wie könnte ich das _schnellst_möglich machen?

Also das es nachher so aussieht:

Zitat:
blah.blubb.irgendwas
Ich hatte es schon so:

Delphi-Quellcode:
function FmtTok(const S: string; const C: Char): string;
var
  B: Boolean;
  I: Integer;
  ResLen: Integer;
begin
  Result := '';
  if S <> 'then
  begin
    B := True;
    for I := 1 to Length(S) do
    begin
      if (S[I] <> C) or ((S[I] = C) and (not B)) then
        Result := Result + S[I];
      B := S[I] = C;
    end;
    ResLen := Length(Result);
    if Result[ResLen] = C then
      SetLength(Result, ResLen-1);
  end;
end;
Das funktioniert auch, aber ich möchte es optimieren. Das "Result := Result + S[I];" dürfte wohl den langsamsten Teil ausmachen... Wie könnte ich das ganzen nun mit PChars hinkriegen?

Ich habs so versucht (*g*):

Delphi-Quellcode:
function FmtTok(const S: string; const C: Char): string;
var
  SPtr, ResPtr: PChar;
  SI: Integer;
  B: Boolean;
begin
  SetLength(Result, Length(S));
  if S <> 'then
  begin
    SPtr := @S[1];
    ResPtr := @Result[1];
    SI := 1;
    B := True;
    while SPtr <> #0 do
    begin
      if (SPtr^ <> C) or ((SPtr^ = C) and (not B)) then
      begin
        ResPtr := SPtr;
        Inc(ResPtr);
      end;
      B := SPtr^ = C;
      Inc(SI);
      Inc(SPtr);
    end;
    if ResPtr^ = C then
      SetLength(Result, Length(Result)-1)
    else SetLength(Result, Length(Result));
  end;
end;
Nicht schimpfen! Das ist erst mein erster Versuch mit PChars zu arbeiten! *g*

Naja der Code(letzterer) funktioniert nicht, gibt ewig Exceptions... jemand ne Idee was verkehrt ist? =[
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: Doppelte Zeichen löschen

  Alt 10. Mai 2005, 16:06
Hallo Pseudemys Nelsoni,

fuer Strings kannst du ja Delphi-Referenz durchsuchenStringReplace mit dem Delphi-Referenz durchsuchenrfReplaceAll-Flag verwenden:
SomeVar := StringReplace('..', '.', SomeVar, [rfReplaceAll]); kA ob die Parameterreihenfolge stimmt

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#3

Re: Doppelte Zeichen löschen

  Alt 10. Mai 2005, 16:10
hallo alcaeus,

erstmal danke für deine Antwort

Aber wie gesagt:

_schnellst_möglich Mit StringReplace wäre die Funktion gleich 10 mal langsamer als meine Ausgangsfunktion. Ich möchte es ja optimieren und nicht verkleinern

Wie gesagt meine obige Funktion geht, die untere nicht.
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Doppelte Zeichen löschen

  Alt 10. Mai 2005, 16:17
Ich würde es wohl eher so machen:
Delphi-Quellcode:
function FmtTok(const S: string; const C: Char): string;
var
  ResP, SP, OrgRes: PChar;
begin
  SetLength(Result, Length(S));
  if S <> 'then
  begin
    SP := @S[1];
    ResP := @Result[1];
    OrgRes := ResP;
    while SP^ <> #0 do
    begin
      if (ResP^ <> C) or (SP^ <> C) or ((ResP^ <> C) and (SP^ = C)) then
      begin
        if ResP^ = C then
          Inc(ResP);
        ResP^ := SP^;
      end;
      if (SP^ <> C) then
        Inc(ResP);
      Inc(SP);
    end;
    SetLength(Result, StrLen(OrgRes));
  end;
end;
Ungetestet

Edit: Jetzt gehts hoffentlich.. ja, es geht
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: Doppelte Zeichen löschen

  Alt 10. Mai 2005, 16:21
Hallo Dax,

das löscht aber alle Punkte.

Ich weiss ja nicht ob du mein Editiertes nich gelesen hast
Aber aus:

Zitat:
...blah...blubb..irgendwas..
sollte:

Zitat:
blah.blubb.irgendwas

werden.

Hast du da ne Idee?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Doppelte Zeichen löschen

  Alt 10. Mai 2005, 16:23
Sorry.. war wohl ein wenig übereifrig, Moment. Steht gleich oben - hoffentlich korrekt
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Doppelte Zeichen löschen

  Alt 10. Mai 2005, 16:40
Man muss nicht unbedingt mit PChar arbeiten um schnell zu sein.

Grüße vom marabu

Nachtrag: Eine Routine zum Komprimieren eines speziellen Zeichens.
Angehängte Dateien
Dateityp: zip strcompress_198.zip (315 Bytes, 12x aufgerufen)
Dateityp: zip strcompresschar_143.zip (332 Bytes, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#8

Re: Doppelte Zeichen löschen

  Alt 10. Mai 2005, 16:40
Moin moin Dax,

danke für deine Mühe

Hast du noch ne Idee wie ich die beiden Punkte aussen wegbekomme?

Zitat:
und die aussen auch


ich wüsste nicht wie ich das mit einbringen könnte, aber ich denke ich würds verstehen wenn ichs sehe
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 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