Lazarus/Zeichen (Char) und Zeichenkette (String)

Aus ZUM-Unterrichten
Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.

Strings als Arrays von Zeichen

Ganz am Anfang unseres Ganges durch Lazarus haben wir die Beschriftung eines Buttons geändert. Beschriftungen sind Zeichenketten, die aus keinem, einem oder mehreren Zeichen bestehen. Variablen vom Typ String können in Lazarus bis zu 255 Zeichen beinhalten.

Eine Variable s vom Typ String wird mit

 
var s : string;

deklariert. Einer String-Variable kann man, wie wir gesehen haben, einfach einen Wert zuweisen, indem man die Zeichenkette durch einfache Hochkommas eingerahmt auf die rechte Seite des Zuweisungsoperators := schreibt, also etwa

 
s:='Die Antwort ist 42.';

Man sieht: Neben den eigentlichen Buchstaben können auch Ziffern, Sonderzeichen und Leerzeichen Teil einer solchen Zeichenkette sein. Auf diese einzelnen Zeichen kann man zugreifen ähnlich wie auf die einzelnen Elemente eines Arrays: mit eckigen Klammern, innerhalb deren die Nummer des Zeichens steht: Im Beispiel hätte also s[1] den Wert "D", s[2] den Wert "i" usw. Die einzelnen Zeichen (engl.: character) haben formal den Typ char.

Problematisch wird es, wenn man versucht auf ein Zeichen mit einer Nummer zuzugreifen, die größer ist als die Länge des Strings. Diese Länge spielt eine wichtige Rolle und kann mit der Funktion length(s) ermittelt werden.

Das folgende Programm gibt also die Buchstaben des genannten Strings untereinander aus:


unit lazio_testumgebung;
{$mode objfpc}{$H+}
interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  s : string;
  i : integer;

implementation

{$R *.lfm}
{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  s:='Die Antwort ist 42.';
  for i:=1 to length(s)
  do Memo1.Lines.Add(s[i]);
end;

end.

Einfügen und Löschen von Teilstrings

Befehl Wirkung
delete(stringvariable,position,anzahl) Der Befehl löscht in der Stringvariable ab der position eine bestimmte anzahl von Zeichen.
insert(teilstring,stringvariable,position) Der Befehl fügt in der Stringvariable ab der position den teilstring ein.

Das folgende Programm löscht im String "Die Antwort ist 42." den Teil "Antwort" und ersetzt ihn durch "Frage".


procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  s:='Die Antwort ist 42.';
  delete(s,5,7);
  Memo1.Lines.Add(s);
  insert('Frage',s,5);
  Memo1.Lines.Add(s);
end;

Teilstrings suchen und herauskopieren

Um nur einen Teil eines Strings zu erhalten, könnte man alles andere weglöschen. Das wäre allerdings sehr umständlich. Die Funktion copy ermöglicht das direkte Herauskopieren eines Teilstrings. Umgekehrt kann es von Interesse sein, zu wissen ob und an welcher Position in einem String ein bestimmter Teilstring vorkommt. Diese Information liefert die Funktion pos.

Befehl Wirkung
copy(stringvariable, position, anzahl) Liefert den Teil der stringvariable zurück, der ab der position steht und anzahl Zeichen umfasst.
pos(teilstring, stringvariable) Findet die erste Position, ab der der teilstring im String vorkommt. Kommt der teilstring gar nicht im String vor, liefert die Funktion den Wert 0.

Das folgende Beispiel zeigt, wie die beiden Funktionen verwendet werden können, um den Text zwischen zwei spitzen Klammern aus einem String herauszufinden:

unit lazio_testumgebung;
{$mode objfpc}{$H+}
interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  s : string;
  auf,zu,anzahl : integer;

implementation

{$R *.lfm}
{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  s:='Das Wichtige steht in spitzen <Klammern>';
  auf:=pos('<',s);
  zu:=pos('>',s);
  anzahl:=zu-auf-1;
  Memo1.Lines.Add(copy(s,auf+1,anzahl));
end;



end.

Groß und Kleinschreibung

Zwei Funktionen liefern bei einem gegebenen String den String komplett in Großbuchstaben bzw. in Kleinbuchstaben zurück.

Die Zeile s:=uppercase('Das ist ein Text) belegt die Variable s also mit dem Wert 'DAS IST EIN TEXT'.

Befehl Wirkung
uppercase(stringvariable) Liefert den String umgewandelt in Großbuchtstaben zurück.
lowercase(stringvariable) Liefert den String umgewandelt in Kleinbuchtstaben zurück.

Einzelzeichen und ihre Ordnungszahl (ASCII-Code)

Im Inneren des Computers sind natürlich auch die Zeichen von Strings letztlich als Zahlen abgelegt. Der so genannte American Standard Code for Information Interchange ASCII ordnet den meisten gebräuchlichen Zeichen eine Zahl zwischen 0 und 255 zu.

Um zwischen der ASCII-Ordnungszahl und den eigentlichen Zeichen hin und her übersetzen zu können, gibt es die beiden Funktionen ord und chr.


Befehl Wirkung
ord(zeichen) Liefert die Ordnungszahl des gegebenen Zeichens.
chr(zahl) Liefert das Zeichen zur gegebenen Ordnungszahl.

Das folgende Programm stellt die Ordnungszahlen der einzelnen Zeichen des gegebenen Strings dar, danach erzeugt es eine zufällige Folge von Großbuchstaben. Dazu muss man wissen, dass die Großbuchstaben (ohne Umlaute) ASCII-Codes zwischen 65 und 91 haben.

unit lazio_testumgebung;
{$mode objfpc}{$H+}
interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls,LazIOStuff;

type
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  s : string;
  i,zahl : integer;

implementation

{$R *.lfm}
{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  s:='Otto';
  for i:=1 to length(s)
  do Memo1.Lines.Add(s[i]+' : '+IntToStr(ord(s[i]))); 

  for i:=1 to 20
  do begin
     zahl:=random(26)+65;
     Memo1.Lines.Add(chr(zahl));
     end;

end;


end.


Aufgabe
  1. Schreibe ein Programm, das in einem Text den ach so häufigen Buchstaben 'e' jeweils durch ein 'ä' ersetzt.
  2. Die verschiedenen Buchstaben kommen in den unterschiedlichen Sprachen statistisch unterschiedlich häufig vor. Schreibe ein Programm, das die unterschiedlichen Buchstaben eines Textes in einer Edit-Komponente zählt und die Zählwerte ausgibt. Groß- und Kleinschreibung sollen dabei nicht beachtet werden.
  3. Bei der so genannten Cäsar-Verschlüsselung wird jedem Buchstaben des Alphabets ein bestimmter anderer Buchstabe zugeordnet, und zwar z.B. derjenige, der 5 Stellen weiter im Alphabet steht. Aus A wird damit F, aus B wird G usw. Am Ende des Alphabets wird aus Y ein D, aus Z ein E. Schreibe ein Programm, das einen Text Cäsar-verschlüsselt.