Zum Inhalt springen

Zeichenkette

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 7. Februar 2005 um 12:37 Uhr durch 80.254.173.18 (Diskussion) (Perl). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Eine Zeichenkette ist eine Folge von Zeichen (Buchstaben, Sonderzeichen, Leerzeichen sind Zeichen) aus einem vorab definierten Zeichensatz. Zeichen können sich in einer Zeichenkette wiederholen, die Reihenfolge der Zeichen ist definiert. Zeichenketten sind Symbolsequenzen endlicher länge.

Mit Zeichenkette wird in der Programmierung auch ein Datentyp bezeichnet, der Zeichenketten (Texte) fester oder variabler Länge enthalten kann. Fast jede Programmiersprache besitzt einen derartigen Datentyp. Meist wird er mit dem englischen Namen String bezeichnet.

Manche Programmiersprachen arbeiten ausschließlich mit diesem Datentyp: Beispiele sind sed, awk und bash.

Repräsentation

Syntax

Im allgemeinen wird eine Zeichenkette in den Programmiersprachen durch das einfache Aneinanderfügen von Zeichen repräsentiert. Sie wird durch einfache oder doppelte Anführungsstriche eingeschlossen. In

  • "Wikipedia"
  • 'Dieser Satz ist eine Zeichenkette.'
  • "123"
  • 'Erste Lösung um das begrenzende Zeichen \', als Teil der Zeichenkette aufzunehmen.'
  • "Zweite Lösung um ein "" aufzunehmen: Verdoppelung des Begrenzers."

Intern

In Programmiersprachen wie C, werden die Zeichenketten fortlaufend im Speicher abgelegt und mit dem ASCII-Zeichen NUL abgeschlossen. Das folgende Beispiel zeigt, wie eine Zeichenkette mit 5 Zeichen in einem Buffer von 10 Byte Länge abgelegt wird.

F R A N K NUL k e f w
46 52 41 4E 4B 00 6B 65 66 77

Die Länge der obigen Zeichenkette ist 5; sie benötigt aber 6 Bytes im Buffer. Buchstaben nach dem NUL-Zeichen zählen nicht mehr zur Zeichenkette; sie können zu einer neuen Zeichenkette gehören oder einfach ungenutzt sein. Eine Zeichenkette in C ist ein Array vom Typ char, wobei die Zeichenkette als Endekennung eine Null (ASCII-Zeichen NUL) enthält. Deswegen heißen solche Zeichenketten auch nullterminiert. Da das Nullzeichen selbst auch noch einen Speicherplatz benötigt, den die Zeichenkette belegt, ist der Speicherbedarf einer Zeichenkette immer mindestens 1 Zeichen größer als die nutzbare Länge der Zeichenkette. Als "Länge der Zeichenkette" wird die Anzahl der Zeichen vor der Endekennung bezeichnet. Sie wird von der C-Funktion strlen() ermittelt.

Eine andere Art die Zeichenkette abzulegen wird in den Programmiersprachen Pascal, Basic, PL/1 u.a verwendet:

lengthF R A N K k f f w
0546 52 41 4E 4B 6B 66 66 77

Noch offen: Hinweis auf UTF-8

Basisoperationen mit Zeichenketten

Die Basisoperationen mit Zeichenketten, die in fast allen Programmiersprachen vorkommen sind die Deklaration von Zeichenketten und das Kopieren und Konkatenieren (aneinander hängen) von Zeichenketten.

Basic

text$ = "FRANK";
text2$ = text$;

Das nachgestellte Dollarzeichen gibt an, dass es ich um eine Zeichenkettenvariable handelt. Zeichenketten werden mit dem Pluszeichen kombiniert (konkateniert):

text2$ = "***" + text$ + "***"

Programmiersprache C

Ein C-Programm definiert zwei Zeichenketten-Variablen mit 5 Zeichen Länge und weist beiden den gleichen Wert (Inhalt) zu: Um das Nullzeichen abzuspeichern, muss man Arrays mit 6 Zeichen deklarieren.

int main(void)
{
  char[6] text1;
  char[6] text2;

  strcpy ( text1, "FRANK" );
  strcpy ( text2, text1 );

  return 0;
}

Perl

Zum Vergleich das Gleiche in Perl

$text  = "FRANK";
$text2 = $text;

Das vorgestellte Dollarzeichen gibt an, dass es sich um skalare Variabeln handelt. Auch Zahlen könnten in diesen Variablen gespeichert werden.

Beispiele

awk

BEGIN {
       getline number
       getline base
       print number " = " convert(number, base) 
      }

function convert (n, b) {
  nstart = n
  z = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  conv = ")" substr(z, (b + 1), 1)
  while (n > 0) {
                 p = n % b 
                 conv = substr(z, (p + 1), 1) conv
                 n = ((n - (n % b)) / b)
                }
  conv = "(" conv
  return conv
}


Algorithmen

Verschiedene Algorithmen arbeiten vorwiegend mit Zeichenketten

Heute schreibt ein Programmierer diese Art Algorithmen meist nicht mehr selbst, sondern benutzt Konstrukte einer Sprache oder Bibliotheksfunktionen.

Anmerkungen

Zu den häufigsten Fehlerquellen und damit zu der häufigsten Angriffsquelle auf Servern zählen Pufferüberläufe. Dabei wird versucht, einer Zeichenkettenvariablen einen Inhalt zuzuweisen, dessen Länge die Länge der Variablen übersteigt. Dadurch werden andere, benachbarte Variablen im Speicher überschrieben. Bei geschickter Ausnutzung dieses Effekts kann ein auf einem Server laufendes Programm manipuliert und für Angriffe auf den Server missbraucht werden.

Zur sicheren Programmierung sollten Zeichenketten-Operationen nur mit Funktionen durchgeführt werden, bei denen die maximale Länge der Zeichenkette überprüft wird. In C wären das Funktionen wie z.B. strncpy(), snprintf()... (anstelle von strcpy(), sprints(), ...)