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?
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?
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:-
- Benachbarte String-Literal-Tokens werden verkettet.
- Leerzeichen, die Token trennen, spielen keine Rolle mehr.
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