Ich habe eine Frage zur String-Verkettung in C ++.
%Vor%Der Code erzeugt:
%Vor% Kann jemand die Verarbeitung dieser Zeile erklären: string str = "ab" + 'c';
?
Ihr Gedanke bezüglich der ersten Zeile ist richtig, genau das passiert.
Es gibt keinen Standardoperator +
für Literalstrings wie "ab"
. Was also passiert, ist, dass der Compiler das übernimmt (als C-Stil-String) und den const char*
-Zeiger benutzt, der auf das Literal zeigt. Es nimmt dann Ihr wörtliches Zeichen 'c'
und fördert es zu int
mit einem gewissen Wert. Dieser int wird dann zur Adresse des Literals addiert und als C-String verwendet. Da Sie den für Ihre literale Zeichenfolge zugewiesenen Speicherplatz überschritten haben, sind die Ergebnisse undefiniert und es wurden nur Zeichen aus der resultierenden Adresse ausgedruckt, bis eine Null gefunden wurde.
Wenn Sie die Zeichenfolge auf einmal erstellen möchten, können Sie dem Compiler helfen, herauszufinden, dass Sie mit einem Cast in string
zuerst konvertieren möchten: std::string str = std::string("ab") + 'c';
. Abwechselnd (wie in einem separaten Kommentar zu sehen ist) mit einer Verkettung, die besser oder schlechter abschneidet. Verwenden Sie je nachdem, was in Ihrem Fall klarer erscheint: std::string str = "ab"; str += 'c';
.
Im zweiten Fall haben Sie bereits eine string
erstellt und string
hat eine überladene operator+
, die die intuitive Verkettung durchführt.
String-Literale können nicht so verkettet werden. "ab"
ist ein Array von Zeichen, das (in diesem Kontext) in einen Zeiger zerfällt und Sie fügen 'c'
hinzu, das ein integraler Bestandteil des Zeigers ist. Der Zeiger wird also um den ASCII-Wert 'c'
vorgezogen.
Das heißt, der obige Code ist äquivalent zu diesem:
%Vor% Ich bin mir sicher, dass das nicht beabsichtigt ist. Tatsächlich ruft es undefiniertes Verhalten auf, weil sich &s['c']
auf eine Speicherregion bezieht, die sich möglicherweise nicht im Adressraum des Prozesses befindet.
Die kurze Form dessen, was Sie eigentlich tun möchten (d. h. Verkettung), ist dies:
%Vor%Das Überladen von Operatoren funktioniert nur, wenn mindestens einer der Parameter des überladenen Operators ein benutzerdefinierter Typ ist (d. h. eine Klasseninstanz), sodass der Operator + nicht überladen werden kann, um eine Zeichenfolge und ein Zeichen hinzuzufügen. und etwas Sinnvolles tun. Im besten Fall erhalten Sie Zeigerarithmetik - fast sicher nicht das, was Sie wollen. Die übliche Arbeitsumgebung hierfür ist eine explizite Konvertierung:
%Vor%Ist eine C-Zeichenfolge.
%Vor%Ist ein Zeichen.
Versuchen:
%Vor%Wenn Sie es einfacher machen wollen, gibt es immer:
%Vor% Alternativ können Sie std::stringstream
:
"ab"
ist ein const char *
. 'c'
ist ein char
. Meine Schätzung ist, dass 'c'
in eine ganze Zahl konvertiert wird, die ganze Zahl zur Adresse von "ab"
hinzugefügt wird und der resultierende Zeiger an den Konstruktor von std::string
übergeben wird. Du hast Glück, dass es nicht kläglich zusammenbricht.
Siehe die anderen Antworten für die richtige Verkettung.
Tags und Links string c++ concatenation