Leerzeichen entfern - Fehler in der Schleife

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Leerzeichen entfern - Fehler in der Schleife

Beitrag von and4more »

Hallo liebes Forum, ich habe eine typische Einsteigerfrage, ich stecke trotz Recherche fest. Folgender Code:

Code: Alles auswählen

 
function Entferne_Leerzeichen(s: string): string;
var
  s1,s2: string;
  i: integer;
 
begin
  s1:=s;
  //wenn string zu kurz, beenden
  if Length(s1)<1 then exit;
  for i:=1 to Length(s1) do begin
    //Leerzeichen: #32
    if (s1[i]=' ') then
      // wenn Leerzeichen erster Buchstabe
      if (i=1) then
        s1:=Copy(s1,2,Length(s1))
      else
        s1:=Copy(s1,1,i-1);
      // solange das Leerzeichen nicht der letzte Buchstabe ist
      if (i<Length(s1)) then
        // ...kann s2 berechnet werden
        s2:=Copy(s1,i+1,Length(s1))
      else
        s2:='';
    s1:=s1+s2;
  end;
  Entferne_Leerzeichen:=s1;
end;
 
compiliert regelrecht, führt aber beim Durchtesten zu einem Runtime-Error(201). Laut Debugger ist der Eingang in die if-Schleife schuld

Code: Alles auswählen

 
..
    if (s1[i]=' ') then
..
 
Ich habe es auch schon mit #32 versucht, aber gleiches Ergebnis. Für mich scheint die Schleife aber so in Ordnung. Was ist falsch? Kennt jemand eine Antwort?
Zuletzt geändert von and4more am Fr 25. Jan 2013, 14:19, insgesamt 2-mal geändert.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Leerzeichen entfern - Fehler in der Schleife

Beitrag von Michl »

Deine selektierte Länge im Copy

s1:=Copy(s1,2,Length(s1))

stimmt nicht -> ab Position 2 mit der Gesamtlänge kopieren geht nicht

s1:=Copy(s1,2,Length(s1)-1) !!!!!!

Einfacher wäre folgender Code:

Code: Alles auswählen

 
  for i:=length(s) downto 1 do
    if s[i]=#32 then delete(s,i,1);
 
fertig

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Leerzeichen entfern - Fehler in der Schleife

Beitrag von and4more »

[ GELÖST]

... du bist der König! Vielen, vielen Dank, funktioniert perfekt.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Leerzeichen entfern - Fehler in der Schleife

Beitrag von Socke »

Michl hat geschrieben:Deine selektierte Länge im Copy

s1:=Copy(s1,2,Length(s1))

stimmt nicht -> ab Position 2 mit der Gesamtlänge kopieren geht nicht

s1:=Copy(s1,2,Length(s1)-1) !!!!!!
Laut Dokumentationist die erste Variante vollkommen richtig und sollte funktionieren.

Ich sehe hier eher das Problem, dass die Schleife von der Variablen s1 abhängt, diese aber verändert wird. Das kann insbesondere bei for-Schleifen zu Problemen führen (zum Beispiel werden einige Elemente übersprungen etc.).

Einfacher kann es sein mit einer While-Schleife von hinten los zu laufen, da man die Zählvariable selbst bearbeiten kann. Vielleicht hilft das ja auch.

Code: Alles auswählen

i := 1;
while i < length(s1) do
begin
  if s1[i] = ' ' then
    delete(s1, i, 1) // Leerzeichen löschen; danach den Index nicht hochsetzen, da ansonsten ein Zeichen übersprungen wird
  else
    inc(i);
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Leerzeichen entfern - Fehler in der Schleife

Beitrag von Michl »

Das stimmt, habe ich nicht gesehen, es ist die For-Schleife :oops:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
Ally
Beiträge: 284
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Leerzeichen entfern - Fehler in der Schleife

Beitrag von Ally »

Also wenn das Ganze keine Programmierübung oder Hausaufgabe ist, hat Lazarus auch noch folgende Lösung zu bieten.

S := StringReplace(S, ' ', '', [rfReplaceAll]);

Funzt auch mit UTF8


Gruß

Antworten