String:de

From Valve Developer Community
Jump to: navigation, search
English

Char (ASCII) oder wchar_t (Unicode) Arrays werden gewöhnlich zum Speichern von Texten verwendet. Diese Puffer haben eine spezielle Bezeichnung: strings oder manchmal "C strings". Sie sind wichtig, aber kompliziert.

Null-Terminierer

Eine Zeichenkette ist immer ein Zeichen länger, als es scheint. Das Extrazeichen ist der Null-Terminierer (binäre Null, eingegeben als \0). Das ist notwendig, da Pointer auf eine Zeichenfolge eher herum gereicht werden, als das Array selbst und ein Pointer keine Daten über die Länge der Zeichenfolge enthalten.

Ohne den Terminierer würde es unmöglich sein, zu bestimmen, wo die Zeichenkette endet und wo die nächste Variable oder einfach ungenutzter Speicher beginnt. Das sind buffer overflows (Speicherüberlauf) und diese sind böse!

Tipp:Der Null-Terminierer muss nicht das letzte Element im Array sein. Die Bytes danach werden einfach von String-bearbeitungs-Funktionen ignoriert.

Erzeugung aus Stringliteralen

char* MyString = "Hello world"; // muss einem Pointer zugewiesen werden!

Dieser Code erzeugt eien String aus einem Stringliteral. Die doppelten Anführungsstriche sind eine spezielle Syntax, welche ein Char-Array mit dessen Inhalt erzeugen. Der Code oben:

  1. reserviert irgendwo willkürlich 12 Bytes Speicher zum Speichern der Zeichenfolge. Das ist ein Byte für jedes Zeichen plus ein automatisches zwölftes für den Null-Terminierer.
  2. erzeugt einen lokalen Char-Pointer, der die Adresse des ersten Zeichens (H in diesem Fall) beinhaltet.

Stringliterale werden oft mit const Variablen übergeben, weil ein Stringliteral im Speicher für die gesamte Lebensdauer des Prozesses im Speicher bleiben wird.

Bemerkung:
Wenn du MyString im Visual Studio Debugger überprüfst, wirst du die gesamte Zeichenkette sehen. Das ist spezielles Verhalten, um das Überprüfen von Zeichenketten zu erleichtern; genau genommen sollte es dir nur das Zeigerende zeigen (das heißt das erste Zeichen, H).

Der Größe nach erstellen

char MyString[12]; // akzeptiert nur eine feste Größe

int StringLen = 12;
char* pMyString = new char[StringLen]; // akzeptiert eine variable Größe

delete[] pMyString; // benutze immer delete / delete[] für alles, was mit 'new' erzeugt wurde, nach deren Gebrauch

beides in diesem Code reserviert 12-Byte Zeichenketten, aber schreibt nichts in diese hinein (also wird deren Inhalt leer oder Kauderwelsch sein). Sie müssen zugewiesen werden, idealerweise mit einer Stringfunktion wie strcpy() oder sprintf().

Der Unterschied zwischen den beiden Methoden ist, dass eine ein Array im Funktionsspeicherraum erzeugt, während das andere einen Pointer in der Funktion erzeugt und new zum zuweisen der Zeichenkette an anderer Stelle verwendet. Der Vorteil von new ist, dass ein Array mit einer Größe erzeugt werden kann, die zur Laufzeit bestimmt werden kann, aber der Nachteil ist, dass, wenn man nicht gewissenhaft in der Verwendung von delete (oder delete[] für Arrays) ist, man einen Speicherleck ertragen muss.

Unicode-Zeichenketten

Bemerkung:
Source ist intern ASCII. Das einzige Mal, das man mit Unicode umgehen muss, ist, wenn man sich in die Arbeit mit VGUI vertieft.

Unicode-Zeichenketten verhalten sich ähnlich wie ASCII-Zeichenketten, aber sind statt dessen wchar_t:de-Arrays. Sie werden von ihrem eigenen Satz an Zeichenkettenfunktionen bearbeitet, die normalerweise 'wc' oder 'wcs' (wide char string) im Namen haben.

wchar_t* MyWideString = L"Здравей свят";

Das L markiert den Stringliteral als aus Unicode bestehend. Das muss auch getan werden, wenn alle Zeichen ASCII-kompatibel sind.

Stringfunktionen

Es gibt eine Vielzahl von Funktionen, die Zeichenketten verarbeiten, von denen die meisten gewöhnlichen ASCII-Varianten ein Source-spezifisches V_* Äquivalent haben. Siehe MSDN für eine recht umfassende Liste oder Suche Visual Studios Klassenansicht für "V_str".