Wie funktioniert die Verkettung von zwei String-Literalen?

Lesezeit: 2 Minuten

Benutzeravatar von grv
grv

char* a="dsa" "qwe";
printf("%s", a);

Ausgang: dsaqwe

Meine Frage ist, warum funktioniert dieses Ding. Wenn ich zwischen zwei String-Literalen ein Leerzeichen oder nichts gebe, werden die String-Literale verkettet.

Wie funktioniert das?

  • Bitte setzen Sie etwas Reales in Fragetitel. Ich habe dies für Sie bearbeitet, bitte sehen Sie, ob es passt.

    – Jens Gustedt

    25. August 2012 um 10:00 Uhr

  • Als Nebeneffekt davon werden Paare von doppelten Anführungszeichen, die in String-Literale eingebettet sind, ignoriert, wie in "dsa""qwe" :)

    – chqrlie

    10. März 2019 um 0:30 Uhr

Benutzeravatar von paxdiablo
paxdiablo

Es ist durch den ISO C-Standard definiert, benachbarte Zeichenfolgenliterale werden zu einem einzigen kombiniert.

Die Sprache ist ein wenig trocken (es ist immerhin ein Standard), aber Abschnitt 6.4.5 String literals von C11 Zustände:

In der Übersetzungsphase 6 werden die Mehrbyte-Zeichenfolgen, die durch eine beliebige Folge benachbarter Zeichen und Breite-String-Literal-Token mit identischem Präfix spezifiziert sind, zu einer einzigen Mehrbyte-Zeichenfolge verkettet.

Dies wird auch in erwähnt 5.1.1.2 Translation phases, point 6 auf gleichem Niveau, wenn auch etwas prägnanter:

Benachbarte String-Literal-Tokens werden verkettet.

Dies bedeutet im Grunde das "abc" "def" ist nicht anders als "abcdef".

Es ist oft nützlich, um lange Zeichenfolgen zu erstellen und dennoch eine schöne Formatierung zu haben, z. B.:

const char *myString = "This is a really long "
                       "string and I don't want "
                       "to make my lines in the "
                       "editor too long, because "
                       "I'm basically anal retentive :-)";

  • Ich fürchte, ich habe einen noch schlimmeren Fall von Analretention, da ich mich verpflichtet fühlen würde, es zu verwenden const char * für diese Definition :)

    – chqrlie

    10. März 2019 um 0:25 Uhr


Und um Ihre ungestellte Frage zu beantworten: “Wozu ist das gut?”

Zum einen können Sie Konstanten in String-Literale einfügen. Du kannst schreiben

#define FIRST "John"
#define LAST "Doe"

const char* name = FIRST " " LAST;
const char* salutation = "Dear " FIRST ",";

und wenn Sie den Namen später ändern müssen, müssen Sie ihn nur an einer Stelle ändern.
Sachen wie diese.

  • Gutes Beispiel. Sie können eine weitere mit hinzufügen printf und scanf Makros definiert in <inttypes.h>: PRId32

    – chqrlie

    10. März 2019 um 0:28 Uhr

Sie haben Ihre eigene Frage beantwortet.

Wenn ich zwischen zwei String-Literalen ein Leerzeichen oder nichts gebe, werden die String-Literale verkettet.

Das ist eines der Merkmale der C-Syntax.

ISO-C-Standard §5.1.1.2 sagt:-

  1. Benachbarte String-Literal-Tokens werden verkettet.
  2. Leerzeichen, die Token trennen, spielen keine Rolle mehr.
1389580cookie-checkWie funktioniert die Verkettung von zwei String-Literalen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy