Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - [Anfängerfrage] Splitten


Nano-Ware - So 04.04.10 17:59
Titel: [Anfängerfrage] Splitten
Hey,

ich machs ganz kurz, und bitte genau auf dieses Beispiel eingehen ;)

Ich habe dein String:

Quelltext
1:
Hans->Meier->13->8c                    

Und möchte, dass diese 4 Teile (Vorname->Name->Alter->Klasse) in je eine Variable gespeichert werden

Wie bewerkstellige ich das?

Vielen Dank schon jetzteinmal

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


elundril - So 04.04.10 18:07

Also du brauchst mal die Funktion PosEx() mit der du rausfindest wo das nächste "->" ist und die Funktion Copy() mit der du gefundene Substrings extrahieren kannst. Außerdem noch eine Schleife, am besten repeat oder auch while. Mit dem wissen solltest du es hinbekommen.

lg elundril


Jann1k - So 04.04.10 18:11

Für genau dieses Beispiel


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var 
 vorname, name, alter, klasse:string;
begin
 vorname := 'Hans';
 name := 'Meier';
 alter := '13';
 klasse := '8c';



Ansonsten musst du den string in einer (oder mehreren) while Schleifen durchgehen und nach deinen Abbruchzeichen "-" oder besser "->" suchen (nur "-" könnte problematisch bei Doppelnamen werden).

Pseudocodemäßig wäre das ungefähr so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Position := 0;

while Zeichen an Position <> "-" und Zeichen an Position+1 <>">"
 vorname := vorname + Zeichen an Position;
 Position := Position+1;

Position := Position +2;

//hier dann so ziemlich dasselbe für name und alter

//Das was nach Alter noch übrig bleibt ist die Klasse
Klasse := Reststring ab Position;


jaenicke - So 04.04.10 19:24

Dabei ist mir ein Beispiel eingefallen, das ich zufällig rumliegen hab:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
type
  TStringArray = array of String;
  PStringArray = ^TStringArray;

procedure ScanF(const AText, ADelim: string; ATarget: PStringArray);
var
  CurTargetIndex, CurTargetLength: Integer;
  CurTarget, CurChar, CurDelim: PChar;
begin
  SetLength(ATarget^, Length(AText));
  CurTargetIndex := 0;
  CurChar := PChar(AText);
  CurDelim := PChar(ADelim);
  CurTarget := CurChar;
  while (CurChar^ <> #0or (CurTarget <> nildo
  begin
    if (CurChar^ = CurDelim^) or (CurChar^ = #0then
    begin
      if CurTarget <> nil then
      begin
        CurTargetLength := Integer(CurChar) - Integer(CurTarget);
        ATarget^[CurTargetIndex] := Copy(CurTarget, 1, CurTargetLength);
        Inc(CurTargetIndex);
        CurTarget := nil;
      end;
      Inc(CurDelim);
    end
    else if CurTarget = nil then
    begin
      CurDelim := PChar(ADelim);
      CurTarget := PChar(CurChar);
    end;
    if CurChar^ <> #0 then
      Inc(CurChar);
  end;
  SetLength(ATarget^, CurTargetIndex);
end;

var
  TargetArray: TStringArray;
  i: Integer;
begin
  ScanF('Hans->Meier->13->8c''->', @TargetArray);
  for i := 0 to High(TargetArray) do
    ShowMessage(TargetArray[i]);
end;
War zwar eher ne Demo für Pointer, aber erfüllt ihren Zweck. :mrgreen: