String
![Info content.png](/w/images/f/f6/Info_content.png)
You can help by finishing the translation.
Also, please make sure the article tries to comply with the alternate languages guide.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!
![Tip.png](/w/images/thumb/4/45/Tip.png/9px-Tip.png)
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
-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.
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
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
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
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“.