De/String

(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 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!
== 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:
# 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.
# erzeugt einen lokalen Char-, der die Adresse des ersten Zeichens (H in diesem Fall) beinhaltet.
Stringliterale werden oft mit Variablen übergeben, weil ein Stringliteral im Speicher für die gesamte Lebensdauer des Prozesses im Speicher bleiben wird.
== 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 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 (oder delete[] für Arrays) ist, man einen Speicherleck ertragen muss.
== Unicode-Zeichenketten ==
Unicode-Zeichenketten verhalten sich ähnlich wie ASCII-Zeichenketten, aber sind statt dessen wchar_t-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“.