C ++ - String-Verkettung

8

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'; ?

    
Eric Conner 18.04.2011, 16:30
quelle

8 Antworten

8

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.

    
Mark B 18.04.2011, 16:32
quelle
2

Ihre Schätzung ist korrekt, außer dass das Zeichenfolgenliteral nicht im Stapel liegt, sondern an einem für die Toolchain spezifischen Speicherort im Speicher, oft in einem schreibgeschützten Bereich.

    
Erik 18.04.2011 16:33
quelle
2
%Vor%

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%     
Nawaz 18.04.2011 16:32
quelle
1

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%     
Neil Butterworth 18.04.2011 16:33
quelle
1
%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 :

verwenden %Vor%     
Mateen Ulhaq 18.04.2011 16:35
quelle
0

"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.

    
Etienne de Martel 18.04.2011 16:33
quelle
0

Ich denke, string str = "ab" + 'c'; funktioniert so ähnlich wie:

%Vor%     
Elalfer 18.04.2011 16:34
quelle
0

Dies ist in C ++ eingebaut:

%Vor%

Ausgabe:

%Vor%     
Michael F Hancock 27.08.2015 17:20
quelle

Tags und Links