C++-Zeichenfolgenliterale

Ein Zeichenfolgenliteral besteht aus null oder mehr Zeichen aus dem Quellzeichensatz, umgeben von doppelten Anführungszeichen (").Ein Zeichenfolgenliteral stellt eine Sequenz von Zeichen dar, die zusammen eine auf NULL endende Zeichenfolge bilden.

Zeichenfolgenliterale können alle Grafikzeichen aus dem Quellzeichensatz enthalten. Dies gilt nicht für doppelte Anführungszeichen ("), den umgekehrten Schrägstrich (\) oder Zeilenumbruchzeichen.Sie enthalten möglicherweise die gleichen Escapesequenzen, die in C++-Zeichenkonstanten beschrieben werden.

C++-Zeichenfolgen haben diese Typen:

  • Array von char[n], wobei n die Länge der Zeichenfolge (in Zeichen) angibt plus 1 für das abschließende '\0**'**, das das Ende der Zeichenfolge kennzeichnet

  • Array von wchar_t für Breitzeichen-Zeichenfolgen

Das Ergebnis einer Änderung einer Zeichenfolgenkonstante ist nicht definiert.Beispiel:

char *szStr = "1234";
szStr[2] = 'A';      // Results undefined

Microsoft-spezifisch

In einigen Fällen können identische Zeichenfolgenliterale "zusammengelegt" werden, um Platz in der ausführbaren Datei zu sparen.Im Zeichenfolgenliteralpooling bewirkt der Compiler, dass alle Verweise auf ein bestimmtes Zeichenfolgenliteral auf einen Punkt am selben Speicherort im Arbeitsspeicher zeigen, anstatt dass alle Referenzpunkte auf eine separate Instanz des Zeichenfolgenliterals verweisen./GF aktiviert Stringpooling.

END Microsoft-spezifisch

Wenn Sie Zeichenfolgenliterale angegeben wird, werden angrenzende Zeichenfolgen verkettet.Daher gilt für diese Deklaration:

char szStr[] = "12" "34";

ist mit dieser Deklaration identisch:

char szStr[] = "1234";

Diese Verkettung von benachbarten Zeichenfolgen erleichtert es, lange Zeichenfolgen über mehrere Zeilen anzugeben:

cout << "Four score and seven years "
        "ago, our forefathers brought forth "
        "upon this continent a new nation.";

Im vorherigen Beispiel wird die gesamte Zeichenfolge Four score and seven years ago, our forefathers brought forth upon this continent a new nation. miteinander verbunden.Diese Zeichenfolge kann auch mit Zeilenzusammenführung wie folgt angegeben werden:

cout << "Four score and seven years \
ago, our forefathers brought forth \
upon this continent a new nation.";

Nachdem alle angrenzenden Zeichenfolgen in der Konstante verkettet wurden, wird das NULL -Zeichen '\0' angefügt, um einen Zeichenfolge-End-Marker für die C-String-Behandlungsfunktionen bereitzustellen.

Wenn die erste Zeichenfolge ein Escapezeichen enthält, kann die Zeichenfolgenverkettung überraschende Ergebnisse zur Folge haben.Betrachten Sie die folgenden zwei Deklarationen: .

char szStr1[] = "\01" "23";
char szStr2[] = "\0123";

Obwohl es natürlich ist, davon auszugehen, dass szStr1 und szStr2 die gleichen Werte enthalten, werden die Werte, die sie tatsächlich enthalten, in der folgenden Abbildung dargestellt.

Hexadezimale Escapezeichen und Zeichenfolgen-Verkettung

Escapezeichen und Zeichenfolgenverkettung

Microsoft-spezifisch

Die maximale Länge eines Zeichenfolgenliterals ist 16384 Bytes (16 KB).Diese Grenze gilt für Zeichenfolgen vom Typ char[ ] und wchar_t[ ].Wenn ein Zeichenfolgenliteral aus den Teilen besteht, die in doppelte Anführungszeichen eingeschlossen sind, verbindet der Präprozessor die Teile zu einer einzelnen Zeichenfolge, und fügt der Gesamtanzahl von Bytes ein zusätzliches Byte hinzu.

Nehmen Sie z.B. an, eine Zeichenfolge besteht aus 40 Zeilen mit 50 Zeichen pro Zeile (2.000 Zeichen) und einer Zeile mit 7 Zeichen und jede Zeile von doppelten Anführungszeichen eingeschlossen.Damit gibt es bis zu 2.007 Bytes plus ein Byte für das abschließende NULL-Zeichens, für insgesamt 2.008 Bytes.Bei Verkettung wird ein zusätzliches Zeichen zur Gesamtzahl der Bytes für jede der ersten 40 Zeilen hinzugefügt.Ergibt insgesamt 2.048 Byte.(Die zusätzlichen Zeichen werden nicht in die endgültigen Zeichenfolge geschrieben.) Beachten Sie jedoch, dass, wenn Zeilenfortsetzungen (\) anstelle von doppelten Anführungszeichen verwendet werden, der Präprozessor kein zusätzliches Zeichen für jede Zeile hinzufügt.

END Microsoft-spezifisch

Bestimmen Sie die Größe von Zeichenfolgenobjekten, indem Sie die Anzahl von Zeichen zählen und 1 für die endende '\0' oder 2 für den wchar_t-Typ hinzufügen.

Da das doppelte Anführungszeichen (") Zeichenfolgen einschließt, verwenden Sie die Escapesequenz (\"), um doppelte Anführungszeichen darzustellen.Das einfache Anführungszeichen (') kann ohne Escapesequenz dargestellt werden.Der umgekehrte Schrägstrich (\) ist ein Zeilenfortsetzungszeichen, wenn er am Ende einer Zeile platziert wird.Wenn ein umgekehrter Schrägstrich in einer Zeichenfolge angezeigt werden soll, müssen Sie zwei umgekehrte Schrägstriche eingeben (\\).(Siehe Phasen der Übersetzung in Preprocessor Reference für weitere Informationen zu Zeilenfortsetzung.)

Um eine Zeichenfolge vom Typ "Breitzeichen" (wchar_t[]) anzugeben, stellen Sie dem öffnenden doppelten Anführungszeichen das Zeichen L voran.Beispiel:

wchar_t wszStr[] = L"1a1g";

Alle normalen Umschaltcodes, die in Zeichenkonstanten aufgeführt sind, sind in Zeichenfolgenkonstanten gültig.Beispiel:

cout << "First line\nSecond line";
cout << "Error! Take corrective action\a";

Da der Escapecode am ersten Zeichen beendet wird, das keine Hexadezimalziffer ist, kann die Angabe von Zeichenfolgenkonstanten mit eingebetteten hexadezimalen Escapecodes zu unerwarteten Ergebnissen führen.Im folgenden Beispiel wird beabsichtigt, ein Zeichenfolgenliteral zu erstellen, welches ASCII 5 enthält, gefolgt von den Zeichen five:

"\x05five"

Das eigentliche Ergebnis ist hexadezimal 5F. Dies ist der ASCII-Code für einen Unterstrich, gefolgt von den Zeichen ive.Das folgende Beispiel erzeugt die gewünschten Ergebnisse:

"\005five"     // Use octal constant.
"\x05" "five"  // Use string splicing.

Siehe auch

Referenz

C++-Literale