Das Verketten von Zeichenfolgen funktioniert nicht wie erwartet [geschlossen]


84

Ich weiß, dass es ein häufiges Problem ist, aber wenn ich nach Referenzen und anderem Material suche, finde ich keine klare Antwort auf diese Frage.

Betrachten Sie den folgenden Code:

#include <string>

// ...
// in a method
std::string a = "Hello ";
std::string b = "World";
std::string c = a + b;

Der Compiler teilt mir mit, dass er keinen überladenen Operator für finden kann char[dim].

Bedeutet das, dass es in der Zeichenfolge keinen + -Operator gibt?

In einigen Beispielen gibt es jedoch eine Situation wie diese. Wenn dies nicht der richtige Weg ist, um mehr Strings zu konzentrieren, was ist der beste Weg?


15
Ihr Code sollte einwandfrei kompiliert werden, was bedeutet, dass Sie nicht den genauen Code anzeigen, der den Fehler verursacht (zusätzlich dazu, dass Sie nicht die genaue Fehlermeldung veröffentlichen).
sbi

Nun, es funktioniert nicht ... Wahrscheinlich ist mein Fehler, dass ich keinen Compiler zur Verfügung gestellt habe ... es ist g ++ nicht vc ... :)
Andry

Antworten:


153

Ihr Code funktioniert wie geschrieben. Sie versuchen wahrscheinlich, etwas zu erreichen, das nichts damit zu tun hat, aber ähnlich ist:

std::string c = "hello" + "world";

Dies funktioniert nicht, da Sie in C ++ anscheinend versuchen, zwei charZeiger hinzuzufügen . Stattdessen Sie müssen mindestens eine der konvertieren char*Literale ein std::string. Entweder können Sie tun , was Sie bereits in der Frage gestellt haben (wie gesagt, dieser Code wird funktionieren) , oder Sie wie folgt vor :

std::string c = std::string("hello") + "world";

3
char * ist ein Zeiger und kann nicht einfach hinzugefügt werden, da eine Speicherzuweisung erforderlich ist. std :: strings verbergen die Zuordnung, deshalb ist es möglich, einen Operator + für sie bereitzustellen.
Vincent Robert

12
@Andry: Der Grund, warum dies nicht funktioniert, ist, dass C ++ seine String-Literale von C erbt, weshalb sie eher vom Typ const char[]als vom Typ sind std::string. In C (und damit auch in C ++) zerfallen Arrays sehr leicht in Zeiger, weshalb "a" + "b" den eingebauten Operator aufruft, der zwei Zeiger hinzufügt. Das Ergebnis davon (ein Zeiger, der irgendwo in den Speicher zeigt) ist natürlich ziemlich nutzlos, aber dennoch bleiben wir dabei.
sbi

2
@ Andy: vernünftig aber falsch. Die Zuordnung hat damit nichts zu tun. Die Erklärung von @sbi ist die richtige (abgesehen von der Tatsache, dass das Ergebnis einer Zeigeraddition kein weiterer Zeiger ist - es ist einfach unmöglich, zwei Zeiger hinzuzufügen, da das Ergebnis bedeutungslos wäre).
Konrad Rudolph

1
Darüber hinaus werden direkt benachbarte Zeichenfolgenliterale vom Compiler automatisch verkettet. std::string c = "Hello" "world";Dies führt beispielsweise zu c == "Helloworld".
Fang

1
Sie können auch Zeichenfolgenliterale verwenden: std;:string c = "hello"s + "world"s;oder einfach eines davon a std::string.
Rakete1111


5

Ich würde das tun:

std::string a("Hello ");
std::string b("World");
std::string c = a + b;

Welche kompiliert in VS2008.


1
Sollte auch in gcc funktionieren.
Graham.reeds

5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.