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:
length | F | R | A | N | K | k | f | f | w |
05 | 46 | 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
- Suche einer Teilzeichenkette mit Algorithmen wie Boyer-Moore
- Bestimmen von Teilzeichenketten, die mit einem regulären Ausdruck beschrieben sind.
- Sortieralgorithmen.
- Parser
- Codeumwandlungen (Unicode usw).
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(), ...)