Delphi String umdrehen

AMD_Rulez

Lieutenant
Registriert
Feb. 2010
Beiträge
582
Hallo,

wie bekomm ich es hin dass ich einen string eingebe und in einem seperatem label mit vertauschter buchstabenreihenfolge wieder ausgebe ohne die reihenfolge der wörter zu ändern?
sprich: Eingabe (hallo ich bins) Ausgabe(ollah hci snib)

die umgekehrte ausgabe mit änderung der reihenfolge ist durch den ReverseString befehl kein problem. habe wahrscheinlich im moment einen denkfehler und mir fehlt der stups in die richtige richtung.
muss ich die leerzeichen beachten oder die einzelnen wörter zwischenspeichern?

vielen dank
 
Hab 5 Sekunden auf Google gebraucht um das zu finden *rolleyes*

Code:
Function String_Reverse(S : String): String;
Var
   i : Integer;
Begin
   Result := '';
   For i := Length(S) DownTo 1 Do
   Begin
     Result := Result + Copy(S,i,1) ;
   End;
End;
 
Den String(1) in einen anderen(2) schreiben, bis ein Leerzeichen erscheint.
Dann den String(2) umdrehen und ausgeben oder zwischen speichern + dem fehlenden Leerzeichen.
Das ganze so lange, bis der String(1) zu ende ist.

@Vorposter: Das ist nicht das was der TE sucht, weil es den gesamten String dreht und nicht die einzelnen Wörter.
Die Wortreihenfolge muss aber bestehen bleiben.
 
Zuletzt bearbeitet:
Mach doch ein Array draus und tausche die Zeichen manuell. So wurde es bei uns gelehrt. Sieht nach Informatikunterricht Ende 12 aus in G9.
 
@Mika911 ahh genau danke. jetzt lass ich dich grauen zellen mal braten.
@MacGyver wie Mika911 schon sagt dabei bleibt die reihenfolge nicht beibehalten. das was du gepostet hast hab ich selber auch schon gefunden. *rolleyes*
 
Dann mußte halt noch ne zweite schleife um den bestehenden Code machen wo dein String gesplittet wird. Dazu gibts ja auch genug Beispiele.
 
Also so spontan hab ich es jetzt nicht kürzer als so geschafft:

Code:
uses SysUtils,StrUtils;

function reverse(Text:string;Trennzeichen:Char):string;
var
  WortAnfang,WortEnde:Integer;
begin
  Result := '';
  WortAnfang := 1;
  repeat
    WortEnde := PosEx(Trennzeichen,Text,WortAnfang);
    if WortEnde = 0 then
    begin
      WortEnde := Length(Text)+1;
    end;
    Result := Result + ReverseString(Copy(Text,WortAnfang,WortEnde-WortAnfang)) + Trennzeichen;
    WortAnfang := WortEnde + 1;
  until WortEnde >= Length(Text);
  SetLength(Result,Length(Result)-1);
end;

Funktioniert wie bereits vorgeschlagen. Es wird jeweils ein Wort Extrahiert ("Copy"), umgedreht ("ReverseString") und ein Trennzeichen angehängt bis das Ende der Zeichenkette erreicht ist.
 
Hallo,

ich habe eine 'Inplace'-Varíante, welche recht grundlegend ist:

Code:
procedure reverse_word(var t:string; first, last:Integer);
var
  ch : char;
begin
  while first < last do begin
    ch := t[first];
    t[first] := t[last];
    t[last] := ch;
    inc(first);
    dec(last)
  end
end;

function reverse(s : string; separator:char):string;
var
  i, j : Integer;
begin
  i := 1;
  j := 1;
  while i <= Length(s) do begin
    while (j <= Length(s)) and (s[j] <> separator) do
      inc(j);

    reverse_word(s, i, j-1);
    while (j <= Length(s)) and (s[j] = separator) do 
      inc(j);
    i:=j
  end;
  reverse := s
end;

Die Funktion dreht die Worte im String von Links nach Rechts um. Nach jedem gefundenen Wort werden die darauffolgenden Trennzeichen überlesen. Die 'reverse_word'- Funktion ist eine klassische Implementierung.
 
haha hatte es letzendlich auch mit inplace gemacht. sieht fast so aus wie bei dir danke:)
 

Ähnliche Themen

T
Antworten
10
Aufrufe
11.874
Zurück
Oben