String: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K (Zeichenketten und Computersicherheit)
K (Beispiele)
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 23: Zeile 23:
 
Hier folgen Beispiele einer "Hello World" - Anwendung, in denen der String ''"Hello World"'' ausgegeben wird.
 
Hier folgen Beispiele einer "Hello World" - Anwendung, in denen der String ''"Hello World"'' ausgegeben wird.
  
'''C'''
+
===C===
<code=c>
+
<syntaxhighlight lang="c">
 
#include <stdio.h>
 
#include <stdio.h>
  
Zeile 34: Zeile 34:
  
 
}
 
}
</code=c>
+
</syntaxhighlight>
  
'''C++'''
+
===C++===
<code=cpp>
+
<syntaxhighlight lang="cpp">
 
#include<iostream.h>
 
#include<iostream.h>
  
Zeile 47: Zeile 47:
  
 
}
 
}
</code=cpp>
+
</syntaxhighlight>
  
'''C#'''
+
===C#===
<code=csharp>
+
<syntaxhighlight lang="csharp">
 
using System;
 
using System;
  
Zeile 64: Zeile 64:
  
 
}
 
}
</code=csharp>
+
</syntaxhighlight>
'''Java'''
+
 
<code=java>
+
===Java===
 +
<syntaxhighlight lang="java">
 
public class Welt {
 
public class Welt {
  
Zeile 76: Zeile 77:
  
 
}
 
}
</code=java>
+
</syntaxhighlight>
  
 
== Intern ==
 
== Intern ==

Aktuelle Version vom 8. April 2018, 17:29 Uhr

Eine Zeichenkette oder ein String (englisch) ist eine Folge von Zeichen (z.B. Buchstaben, Ziffern, Sonderzeichen und Steuerzeichen) aus einem definierten Zeichensatz. Zeichen können sich in einer Zeichenkette wiederholen, die Reihenfolge der Zeichen ist definiert. Zeichenketten sind somit Sequenzen aus Symbolen mit endlicher Länge.

In der Programmierung wird mit Zeichenkette ein Datentyp bezeichnet, der eine Kette von Zeichen mit fester oder variabler Länge enthält. Damit werden hauptsächlich Worte, Sätze und ganze Texte gespeichert. Fast jede Programmiersprache besitzt einen derartigen Datentyp und manche Programmiersprachen arbeiten ausschließlich mit diesem Datentyp. Beispiele dafür sind sed, awk und bash.

Repräsentation

Zeichenketten können auf verschiedenen Ebenen repräsentiert werden. Eine davon ist der Quelltext eines Programms, der vom Übersetzer gelesen und interpretiert wird. Eine andere ist, wie eine Zeichenkette zur Laufzeit eines Programms im Speicher abgelegt wird.

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:

  • "Wikipedia"
  • 'Dieser Satz ist eine Zeichenkette.'
  • "123"
  • "Erste Lösung, um das Anführungszeichen \" als Teil der Zeichenkette aufzunehmen."
    (z. B. in C; C-Strings werden stets durch Gänsefüßchen begrenzt)
  • 'Zweite Lösung, um ein '' aufzunehmen'
    (Verdoppelung des Begrenzers, z. B. in Pascal,SQL oder Rexx; Pascal-Strings werden stets durch Hochkommata begrenzt)
  • "Dritte Lösung, um ein ' aufzunehmen":
    (Verwendung eines bzw. des anderen Begrenzers, z. B. in Rexx oder Python)

Solche Strings müssen normalerweise in einer einzigen Zeile notiert werden. In manchen Programmiersprachen wie etwa Python können jedoch Strings, die durch verdreifachte Anführungszeichen begrenzt werden, auch mehrere Zeilen umfassen.

Beispiele

Hier folgen Beispiele einer "Hello World" - Anwendung, in denen der String "Hello World" ausgegeben wird.

C

#include <stdio.h>

int main() {

  printf("Hello World");  /*für Strings ist auch die Funktion "puts()" erlaubt */

  return 0;

}

C++

#include<iostream.h>

int main() {
  
  cout<<"Hello World";

  return 0;

}

C#

using System;

namespace HalloWelt {

class Welt {

  static void Main(string[] args) {
    
    Console.WriteLine("Hello World");
  
  }

}

Java

public class Welt {

  public static void main(String[] args] {

    System.out.println("Hello World");

  }

}

Intern

Es gibt mehrere Verfahren, um Zeichenketten effizient abzuspeichern. Zum Beispiel kann ein Zeichen aus dem verwendeten Zeichensatz als Abschlusszeichen definiert werden. Eine Zeichenkette hört dann vor dem ersten Vorkommen dieses Zeichens auf. Eine andere Möglichkeit ist, die Länge der Zeichenkette separat zu speichern.

Repräsentation mit Abschlusszeichen

In Programmiersprachen wie C werden die Zeichenketten fortlaufend im Speicher abgelegt und mit dem Nullzeichen (NUL in ASCII) abgeschlossen. Das Nullzeichen ist das Zeichen, dessen binäre Repräsentation nur aus Nullen besteht. 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.

Der Vorteil dieser Methode ist, dass die Länge eines Strings praktisch nur durch den verfügbaren Speicher begrenzt ist; ein Nachteil ist, dass er keine Null-Zeichen enthalten kann, und dass der Umgang vergleichsweise schwierig und ineffizient ist; beispielsweise kann die Länge eines solchen Strings nur durch das Abzählen der Zeichen ermittelt werden.

Repräsentation mit separater Längenangabe

Eine andere Art, Zeichenketten abzulegen, wird in den Programmiersprachen Pascal, BASIC, PL/1 u. a. verwendet:

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

Zeichenketten, die so gespeichert werden, können eine bestimmte Länge nicht überschreiten. In Turbo Pascal wird die Länge zum Beispiel im „nullten“ Zeichen gespeichert. Da ein Zeichen 8 Bit groß ist, ist die Länge damit auf 255 Zeichen begrenzt. Die Nachfolgesprache Borland Delphi hat das Längenfeld auf 31 Bit erweitert und unterstützt Zeichenketten von bis zu 2 Gigabyte Länge. Auch in Rexx wird die Länge in vier Bytes gespeichert, wodurch die maximale Länge für die meisten praktischen Zwecke quasi unbegrenzt ist.

Noch offen: Hinweis auf MBCS/UTF-8

Basisoperationen mit Zeichenketten

Die Basisoperationen mit Zeichenketten, die in fast allen Programmiersprachen vorkommen, sind Kopieren, Ermitteln der Länge, Verketten, Bilden von Teilketten, Mustererkennung, Suchen von Teilketten oder einzelnen Zeichen.

Zum Kopieren von Zeichenketten wird in vielen höheren Programmiersprachen der Zuweisungsoperator (meist „=“ oder „:=“) benutzt. In C wird das Kopieren mit der Standardfunktion strcpy durchgeführt. Wie zeitaufwendig das Kopieren ist, hängt stark von der Repräsentation der Zeichenketten ab. Bei einem Verfahren mit Referenzzählern besteht das Kopieren nur aus dem Erhöhen des Referenzzählers. In anderen Verfahren muss eventuell die komplette Zeichenkette kopiert werden.

Zum Verketten gibt es in vielen Programmiersprachen Operatoren wie „+“ (BASIC, Pascal, Python, Java), „&“ (Ada, BASIC), „.“ (Perl, PHP). In C gibt es dafür die Funktion strcat. Um an eine bereits bestehende Zeichenkette eine andere anzufügen, stellen einige Sprachen einen eigenen Operator zur Verfügung („+=“ in Java, „.=“ in Perl, PHP).

Um eine Teilkette zu erhalten, gibt es verschiedene Möglichkeiten. Durch die Angabe von (Zeichenkette, Startindex, Endindex) bzw. (Zeichenkette, Startindex, Länge) kann eine Teilkette eindeutig definiert werden. Diese Operation heißt häufig substr. Einige Programmiersprachen, zum Beispiel Python, bieten syntaktischen Zucker für diese Operation an (siehe Beispiele).

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.

Zeichenketten und Computersicherheit

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(), sprintf(), …).

Dieser Beitrag stammt in seiner ersten oder einer späteren Version der deutschsprachigen Wikipedia. Er ist dort unter Zeichenkette zu finden, die Liste der bisherigen Autoren befindet sich in der Versionsliste.