Zeichenkette

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Als Zeichenkette (engl. String) wird in der Programmierung üblicherweise eine beliebige Anzahl von Zeichen angesehen. Eine entsprechende Konstante (Literal) ist als Zeichenfolge unter Anführungszeichen stehend anzugeben. Zeichenketten können dann in Variablen, sogenannte Zeichenketten- oder Stringvariablen, gespeichert werden oder generell in Zeichenkettenausdrücken gebildet werden und bei BASIC-Befehlen mit Zeichenkettenparametern wie etwa bei Lade- und Speicherbefehlen LOAD, SAVE, VERIFY und OPEN u.v.a.m.[1] oder bei Ausgabebefehlen, z.B. mit PRINT oder CMD angegeben werden. Weiterhin können Zeichenketten per READ aus mittels DATA abgelegter Daten eingelesen werden. Hierbei sind jedoch einige Besonderheiten zu berücksichtigen (siehe: DATA).

10 PRINT "DIES IST EINE ZEICHENKETTE"
11 INPUT "DIES AUCH (WEITER MIT RETURN)"; A$
12 PRINT "DIE AUSGABE AUCH: " A$

Zeichenkettenvariablen haben den Vorteil in Programmen entsprechend angepasst werden zu können. Somit kann platzsparender programmiert werden.
Eine Zeichenkette beim C64 darf maximal 255 Zeichen lang sein. Zeichenkettenvariablen sind dabei entsprechend flexibel in der Länge, welche im Bereich von 0 bis 255 liegen kann.

  • Bei BASIC-Ausgabebefehlen wie dem PRINT- oder CMD-Befehl werden Zeichenketten mit dem Semikolon (;) fehlerfrei kombiniert bzw. aneinandergereiht. Bei anderen BASIC-Befehlen, die nicht der Ausgabe dienen oder in anderen Programmiersprachen ist das Zurückgreifen auf eine Verknüpfung von Zeichenketten durchaus üblich oder notwendig.
  • Mit dem Pluszeichen (+) als einzigen für Zeichenketten möglichen Operator können Zeichenketten zusammengefügt werden. Dabei ist es egal, ob es mehrere oder sogar gleiche Zeichenketten sind.
    Anmerkung für den speicherschonenden Umgang: Das Pluszeichen sollte, wenn möglich, vermieden werden, da dadurch Zwischenergebnisse in der Zeichenkettenarithmetik am String-Heap erzeugt werden, die gleich wieder nach der Ausgabe verworfen werden und damit die Garbage Collection hier eher aktiv wird bzw. werden muss.
10 A$="1": B$="2"
11 C$ = A$ + B$
12 A$ = A$ + A$ + C$ + " " + B$
13 A$ = A$ + B$ + C$ + A$
14 B$ = B$ + A$
15 PRINT "A$:"+A$ ;CHR$(13); "B$:"+B$ ;CHR$(13); "C$:"+C$
  • Mit den BASIC-Befehlen LEFT$, RIGHT$ und MID$ werden Teile aus Zeichenketten entsprechend links- bzw. rechtsseitig oder mittig entnommen.
  • Die Länge einer Zeichenkette lässt sich mit LEN ermitteln.
  • Zur Umwandlung einer Zeichenkette in einen Zahlencode oder eine Zahl sind ASC bzw. VAL nützlich.
  • Zur Umwandlung eines Zahlencodes oder einer Zahl in eine Zeichenkette werden CHR$ bzw. STR$ verwendet.
  • Bestimmte Zeichen wie z.B. Steuerzeichen oder auch das Delimiterzeichen für Zeichenkettenkonstanten (") lassen sich nur mit dem CHR$-Befehl einer Zeichenkette hinzufügen. Z.B. den Zeichenkettenwert aus Variable A$ in der gängigen Notation mit Anführungszeichen darstellen:
100 PRINT CHR$(34)A$CHR$(34)
Dies hat auch den Nebeneffekt, dass etwaige Steuerzeichen in Zeichenkette A$ nicht ausgeführt bzw. interpretiert werden, sondern wie im Listing codiert ausgegeben werden.
  • Gezielt kann eine Zeichenkettenvariable mit einem Leer-String A$ = "" gelöscht werden (was den belegten Speicher spätestens nach einer Garbage-Collection frei gibt).
  • Die o.g. Befehle lassen sich auch kombiniert anwenden:
 A$="DIES IST EIN TEST": PRINT CHR$( LEN(A$)+60 )
  • Um fehlerfrei, ohne ungeplanten Abbruch und Meldungen des Interpreters die Eingabe-Befehle GET und INPUT zu nutzen, lohnt es sich hierfür nur Zeichenkettenvariablen zu nutzen und diese bei Bedarf in eine Zahlenvariable (A oder A%) mit VAL oder ASC umzuwandeln.


BASIC-Erweiterungen[Bearbeiten | Quelltext bearbeiten]

Die Zeichenketten-Befehle des BASIC V2.0 bieten nur begrenzten Komfort. Deshalb findet man in BASIC-Erweiterungen und höheren BASIC-Versionen oft weitergehende Befehle bzw. Funktionen, wobei beispielsweise Zeichenketten abseits des eigentlichen Gebrauchs auch als Speicherort für grafische Daten (Bitmap-Ausschnitt, Sprites) herangezogen werden können. Typische Vertreter sind:


Weitere Beispiele[Bearbeiten | Quelltext bearbeiten]

Die Zeichenkette A$ einer beliebigen Länge (LA) maximal 255-mal mit einem Leerzeichen füllen:

10 A$="": LA=255: FOR X=1 TO LA: A$ = A$ + " ": NEXT X

Zusammengesetzte Zeichenkette bei der Angabe des Dateinamens mit Angabe von Zugriffsmodus und Dateityp:

10 D$="DATEINAME"
20 V=2
30 OPEN 1,8,3,D$+STR$(V)+CHR$(126)+",S,R"


Ausgabe von verschiedenen Zeichenketten bei PRINT:

10 A$="GUTEN"
11 B$="MORGEN"
12 C$="TAG"
20 PRINT A$+" ";B$ CHR$(13)+ A$C$;CHR$(13),C$,B$

Erzeugt als Ausgabe

RUN
GUTEN MORGEN
GUTENTAG
          TAG       MORGEN

READY.


Ermittlung der Speicheradresse einer Zeichenkette (nur C64 BASIC V2)[2]:

100 A$="TEST"
110 GOSUB 500
120 PRINT AD,A$
130 END
500 AD=0*LEN(A$)+PEEK(71)+256*PEEK(72)
510 AD=PEEK(AD+1)+256*PEEK(AD+2)
520 RETURN

Das 0*LEN(A$) provoziert einen Zugriff des Interpreters auf A$, das Ergebnis wird ignoriert; die Adresse des String-Descriptors liegt in den Speicherstellen 71/72. Aus dem String-Descriptor wird danach die Adresse des eigentlichen Strings ausgelesen (Zeile 510).

Diese Vorgehensweise ist praktisch, wenn man z.B. per PEEK oder POKE auf einzelne Zeichen der Zeichenkette zugreifen oder die Adresse an eine Maschinensprache-Routine weitergeben will. Allerdings ist der Ansatz nicht sonderlich portabel und wird z.B. mit vielen Compilern nicht funktionieren.

Anmerkungen[Bearbeiten | Quelltext bearbeiten]

  1. Bei BASIC V2.0 erlauben folgende Befehle und Funktionen Zeichenkettenausdrücke in Parametern: ASC, CMD, FRE, IF, INPUT, LEFT$, LEN, LOAD, MID$, OPEN, POS, PRINT, PRINT#, RIGHT$, SAVE, USR, VAL, VERIFY
    Weitere finden sich bei BASIC-Erweiterungen oder höheren BASIC-Versionen.
  2. Thema: Speicherstelle von Variable bestimmen auf Forum64.de