Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   String Manipulation (https://www.delphipraxis.net/212210-string-manipulation.html)

PascalProgram 5. Jan 2023 00:48

Delphi-Version: 5

String Manipulation
 
Hallo, ich hätte einige Fragen zur String Manipulation. Ich wollte wissen, wieso man bei Strings bspw. +1 benutzt oder -1. Was bedeutet das? Wie wirkt sich diese +1 oder -1 aus?

Zudem wollte ich wissen, wieso ich in einer For Schleife keine While Schleife mit rein integrieren kann, um somit ein Ergebniswert für jeden Durchgang <> Leerzeichen speichern kann.


Bsp: var i:byte; s:string; Anzahl:byte;


For i:= 1 to length(s) do begin
While s[i] <> ‘ ‘
Inc (Zähler);
anzahl:= Zähler;
end;

Ich bedanke mich im Voraus für die Hilfe :).

Jasocul 5. Jan 2023 07:28

AW: String Manipulation
 
Zitat:

Zitat von PascalProgram (Beitrag 1517024)
Hallo, ich hätte einige Fragen zur String Manipulation. Ich wollte wissen, wieso man bei Strings bspw. +1 benutzt oder -1. Was bedeutet das? Wie wirkt sich diese +1 oder -1 aus?

Ich verstehe die Frage nicht. Auch in deinem Beispiel ist nichts mit +/-1.
Zitat:

Zitat von PascalProgram (Beitrag 1517024)
Zudem wollte ich wissen, wieso ich in einer For Schleife keine While Schleife mit rein integrieren kann, um somit ein Ergebniswert für jeden Durchgang <> Leerzeichen speichern kann.

Natürlich geht das. Der Compiler wird dir sicher eine Fehlermeldung gegeben haben. Diese einfach genau lesen, dann kommt man meistens schon weiter. Ansonsten bei der nächsten Frage die Fehlermeldung mitliefern. Das hilft auch uns, den Fehler schneller zu erkennen.

Trotzdem schonmal folgende Infos:
While-Schleifen in Delphi müssen so aussehen: While <Bedingung> do
Das "do" fehlt bei dir.
Ob in Delphi 5 schon Umlaute bei den Variablen erlaubt sind, weiß ich nicht. Ich würde aber in jedem Fall davon abraten, Umlaute zu verwenden.

Gausi 5. Jan 2023 09:00

AW: String Manipulation
 
Wenn man mit Strings so arbeitet, wie man es in Delphi normalerweise macht, dann ist ein +1 oder -1 unsinnig. Wo das zum Einsatz kommen kann, ist bei der PChar-Variante, bei der ein String (vereinfacht gesagt) als Zeiger auf einen Punkt im Speicher verwaltet wird. Diesen Zeiger kann man erhöhen oder verringern - jedoch sollte man hier nicht mit "+1" arbeiten, um das nächste Zeichen zu bekommen, sondern mit SizeOf(Char) - weil ein Zeichen in der Regel zwei Bytes groß ist.
Aber diese Form der Stringverarbeitung braucht man bei Delphi normalerweise nicht.

Zu deinem Code: Der funktioniert vorne und hinten nicht. Deine While-Schleife ist im Zweifel auch eine Endlosschleife. Ich vermute, dass du hier "if" meinst. Falls du die Anzahl der Zeichen in dem String zählen willst, die keine Leerzeichen sind, dann würde ich das so machen:

Delphi-Quellcode:
Anzahl := 0;
For i := 1 to length(s) do begin
  if s[i] <> ' ' then
    Inc(Anzahl);
end;
Edit: Kann es sein, dass du C-Code vor dir hast, den du nach Delphi umschreiben willst? Das sieht ein wenig danach aus ...

TurboMagic 5. Jan 2023 09:22

AW: String Manipulation
 
Mir stellt sich generell die Frage was mit dem Konstrukt erreicht werden soll.

Grüße
TurboMagic

Klapauzius 5. Jan 2023 09:38

AW: String Manipulation
 
Ich denke das ist ein Problem wie Delphi in der Vergangenheit mit Strings umgegangen ist, da waren doch plötzlich Strings 0 basiert unter den mobileplatforms, was plötzlich wieder geändert wurde. Nun verwenden wieder alle Delphi Compiler standardmässig 1 basierte Strings. D.h. mal musste man bei 1 beginnen mit iterieren mal bei 0.

https://docwiki.embarcadero.com/RADS...rings_(Delphi)

Allgemein gültig war glaub ich aber für alle Delphiversionen:

Delphi-Quellcode:
Anzahl:= 0;
for i:= low(s) to high(s) do
begin
 if s[i] <> ' ' then
    Inc(Anzahl);
end;
  showmessage(inttostr(Anzahl));

PascalProgram 5. Jan 2023 12:06

AW: String Manipulation
 
Zitat:

Zitat von Gausi (Beitrag 1517031)
Wenn man mit Strings so arbeitet, wie man es in Delphi normalerweise macht, dann ist ein +1 oder -1 unsinnig. Wo das zum Einsatz kommen kann, ist bei der PChar-Variante, bei der ein String (vereinfacht gesagt) als Zeiger auf einen Punkt im Speicher verwaltet wird. Diesen Zeiger kann man erhöhen oder verringern - jedoch sollte man hier nicht mit "+1" arbeiten, um das nächste Zeichen zu bekommen, sondern mit SizeOf(Char) - weil ein Zeichen in der Regel zwei Bytes groß ist.
Aber diese Form der Stringverarbeitung braucht man bei Delphi normalerweise nicht.

Zu deinem Code: Der funktioniert vorne und hinten nicht. Deine While-Schleife ist im Zweifel auch eine Endlosschleife. Ich vermute, dass du hier "if" meinst. Falls du die Anzahl der Zeichen in dem String zählen willst, die keine Leerzeichen sind, dann würde ich das so machen:

Delphi-Quellcode:
Anzahl := 0;
For i := 1 to length(s) do begin
  if s[i] <> ' ' then
    Inc(Anzahl);
end;
Edit: Kann es sein, dass du C-Code vor dir hast, den du nach Delphi umschreiben willst? Das sieht ein wenig danach aus ...

Ich wollte in einem Satz die Länge der Wörter durchgehen und wenn ein Wort z.B länger als 5 Zeichen ist dieses Wort in der String Variable S löschen.

Ich habe es geschafft ein Programm zu schreiben, das alle Buchstaben zählt und ein Programm, welches alle Wörter zählt. Aber ich weiß nicht wie ich die Schleife gestalten soll, damit nach jedem Wort kontrolliert wird, ob das Wort im Satz >=5 ist und das Wort gelöscht werden soll, wenn es länger als 5 Zeichen ist. Das war mein Ziel mit der While Schleife, den Ablauf so zu gestalten, dass nach einem Leerzeichen, kontrolliert wird ob Wort >=5.

himitsu 5. Jan 2023 21:02

AW: String Manipulation
 
Eine schöne Aufgabe für Delphi-Referenz durchsuchenTRegEx.Replace.



Du weißt wann der letzte Trenner war (bzw. kannst die das merken), also kannst du vom nächsten Trenner ausrechnen wie lang es ist.

Oder man kann vorher auch einfach alle Wörter splitten, geht dann jedes Wort einzeln durch und setzt es am Ende wieder zusammen.



Und wer eine eine FOR-Schleife vorwärts durchläuft, dabei in den durchlaufenen Daten etwas löscht, hat es nicht anders verdient, wenn ihm das am Ende um die Ohren fliegt.
(Löschen rückwärts, oder nach "einem" Löschen die Schleife abbrechen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 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