Announcement

Collapse
No announcement yet.

String-Operation

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • String-Operation

    Hallo
    Eigentlich ist das Problem simpel:

    Ich durchsuche einen String nach Punkten (.) - Immer wenn ein Punkt gefunden wird, soll nach diesem Punkt ein Leerzeichen eingefügt werden, sofern noch keins da ist.

    Mein Problem: Wenn ich nun ein Leerzeichen einfüge, stimmt dann die for-Bedigung mit der Länge noch ?

    <pre>
    for i := Length(s) downto 1 do
    begin
    if (s[i] = CHR_PERIOD) and (s[i + 1] <> ' ') then
    Insert(' ', s, i + 1);
    end;
    </pre>

  • #2
    Hallo,

    erledigt nicht <b>AnsiReplaceStr</b> aus der Unit StrUtils den Job bequemer

    Comment


    • #3
      Hi Roger,<br>
      <b>AnsiReplaceStr</b> ist wohl nicht die richtige Funktion, da du ja nur bei Punkten ohne nachfolgendes Leerzeichen eine insert ausführen möchtest.<br>
      Du hast mit der Länge keine Schwierigkeiten, da du ja rückwärts suchst und eine Vergrößerung des Strings keine Probleme bereitet. Du solltest jedoch bei der Prüfung, ob das dem Punkt nachfolgende Zeichen ein Leerzeichen ist, das Stringende berücksichtigen, da du sonst bei einem String mit einem Punkt als letztes Zeichen ggf. eine Zugriffsverletzung erhältst.<br>
      <br>
      Gruß Richar

      Comment


      • #4
        Hallo,

        &gt;..AnsiReplaceStr ist wohl nicht die richtige Funktion...

        wer hat gesagt, das diese Funktion nur ein Mal aufgerufen werden darf ;-)
        <pre>
        <b>uses</b> StrUtils;
        <br>
        <b>procedure</b> TForm1.Button1Click(Sender: TObject);
        <b>var</b>
        sInput : <b>String</b>;
        sOutput1 : <b>String</b>;
        sOutput2 : <b>String</b>;
        <b>begin</b>
        sInput := <font color="#9933CC">'Test1.Test2. Test3. Test4.Test5'</font>;
        sOutput1 := AnsiReplaceStr(sInput, <font color="#9933CC">'.'</font>, <font color="#9933CC">'. '</font>);
        sOutput2 := AnsiReplaceStr(sOutput1, <font color="#9933CC">'. '</font>, <font color="#9933CC">'. '</font>);
        ShowMessage(sOutput2);
        <b>end</b>;
        </pre&gt

        Comment


        • #5
          Hi,<br>
          klar kann mann die Funktion mehrfach aufrufen - aber wie sieht es mit der Laufzeit aus. In der Regel ist es bei größeren Datenmengen schon entscheidend, ob man ein String einmal oder mehrmals durchläuft.<br>
          Stichwort: Geschwindigkeitsoptimierung ;-)<br>
          <br>
          Gruß Richar

          Comment


          • #6
            hi,<br>ich würde einfach mal die gebastelte Schleife und STRINGREPALCE mit gettickcount gegeneinander laufen lassen, dann wird man ja sehen..<br>
            <br>
            <PRE>
            function TForm1.ERSETZE(s:string;was:string;durch_was:strin g):string;
            begin
            result := STRINGREPLACE(s,was,durch_was,[rfreplaceall]);
            end;
            </PRE><br>Nach Andreas Vorschlag halt zweimal starten...<br> Michae

            Comment


            • #7
              wie wär's denn mit

              if s='' then exit;

              for i := Length(s)-1 downto 1 do

              begin

              if (s[i] = CHR_PERIOD) and (s[i + 1] <> ' ') then

              Insert(' ', s, i + 1);

              end

              Comment


              • #8
                ist natürlich immer noch falsch, muss heissen

                if Length(s) <2 then exit;

                for i := Length(s)-1 downto 1 do

                begin

                if (s[i] = CHR_PERIOD) and (s[i + 1] <> ' ') then

                Insert(' ', s, i + 1);

                end

                Comment


                • #9
                  wie wär's denn mit

                  if Length(s) <2 then exit;

                  for i := Length(s)-1 downto 1 do

                  begin

                  if (s[i] = CHR_PERIOD) and (s[i + 1] <> ' ') then

                  Insert(' ', s, i + 1);

                  end

                  Comment

                  Working...
                  X