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 ?

 for i := Length(s) downto 1 do
 begin
 if (s[i] = CHR\_PERIOD) and (s[i + 1] ' ') then
 Insert(' ', s, i + 1);
 end; 

Hallo,

Length () wird nur einmal beim Start aufgerufen, also kein Problem. Vielleicht würde ein Pacal-Purist das nicht für guten Stil halten, aber es ist eine Startbedingung und beim Start stimmt sie, also was solls. Unter C ist so etwas selbstverständlich und üblich.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

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 ?

for i := Length(s) downto 1 do
begin
if (s[i] = CHR_PERIOD) and (s[i + 1] ’ ‚) then
Insert(‘ ', s, i + 1);
end;

Hallo,
Length () wird nur einmal beim Start aufgerufen, also kein
Problem. Vielleicht würde ein Pacal-Purist das nicht für guten
Stil halten, aber es ist eine Startbedingung und beim Start
stimmt sie, also was solls. Unter C ist so etwas
selbstverständlich und üblich.

Hallo,
das kann dann aber trotzdem zu Problemen führen, weil nach
jedem Einfügen der String länger wird und die letzten
Zeichen dann nicht mehr erwischt werden.

Vorschlag:
Deklariere einen zusätzlicheN String, Setze den vor der
Schleife auf Leerstring.
Dann hänge in jedem Durchlauf das gelesene Zeichen
und die evtl. dazukommenden Zeichen an diesen String an.
So hast Du am Ende eine Kopie incl. eingefügter Leerzeichen.
Gruß Uwi

Hallo,

for i := Length(s) downto 1 do
begin
if (s[i] = CHR_PERIOD) and (s[i + 1] ’ ‚) then
Insert(‘ ', s, i + 1);
end;

das kann dann aber trotzdem zu Problemen führen, weil nach
jedem Einfügen der String länger wird und die letzten
Zeichen dann nicht mehr erwischt werden.

da hast du wohl übersehen, dass die Zählschleife beginnend mit dem letzten Zeichen abwärts läuft.

Allerdings ist dadurch ein Fehler im Code entstanden:
Wenn er beim letzten Zeichen das darauffolgende Zeichen abfragt, geht er über das Ende des Strings hinaus, was unter Umständen zu einer Access Violation führt.

Hier sind vier Fälle zu unterscheiden:

  1. s[length(s)] CHR_PERIOD
    dann wird das folgende Zeichen gar nicht erst abgefragt (es sei denn, die verkürzte Auswertung wäre bewusst ausgeschaltet worden)

  2. s[length(s)] = CHR_PERIOD
    das folgende Zeichen wird abgefragt. Hinter dem String beginnt Speicher, auf den das Prog keine Zugriffsberechtigung hat. Dadurch wird eine Access Violation Exception ausgelöst.

  3. s[length(s)] = CHR_PERIOD
    das folgende Zeichen wird abgefragt und es liegt in einem Speicherbereich, auf den das Prog Zugriff hat. Zufälligerweise ist es ein Leerzeichen. Nix passiert. Alles läuft weiter.

  4. s[length(s)] = CHR_PERIOD
    das folgende Zeichen wird abgefragt und es liegt in einem Speicherbereich, auf den das Prog Zugriff hat. Es ist KEIN Leerzeichen. Also Wird ein Leerzeichen an den String angehängt. Dh alle Strings, die auf einen Punkt enden bekommen ein Leerzeichen drangehängt. Ob das gewünscht ist, muss der Programmierer entscheiden.

Gruß, Niels

Ergänzung
möglicherweise ist das Ganze doch kein Problem, da meines Wissens die WideStrings von Delphi immer mit einem chr(0) abgeschlossen werden (damit eine schelle Umwandlung in PChar möglich ist). Damit wäre das Zeichen an der Stelle length + 1 immer chr(0) was in jedem Fall zum Anhängen eines Leerzeichens an einen abschließenden Punkt führt.

Es ist aber ganz gewiss keine gute Programmierpraxis, auf diese Weise das abschließende chr(0) zu benutzen.

Bei shortString gilt die erwähnte Problematik aber.

Gruß, Niels