Ich dachte, das wäre wirklich einfach, aber es bringt einige Schwierigkeiten mit sich. Wenn ich habe
std::string name = "John";
int age = 21;
Wie kombiniere ich sie, um eine einzelne Zeichenfolge zu erhalten "John21"
?
c++
int
concatenation
stdstring
Obediah Stane
quelle
quelle
Boost::lexical_cast
,std::stringstream
,std::strstream
(was veraltet ist), undsprintf
gegensnprintf
.Antworten:
In alphabetischer Reihenfolge:
#include <string>
)#include <sstream>
(von Standard C ++)quelle
String(number)
.In C ++ 11 können Sie Folgendes verwenden
std::to_string
: z.quelle
Wenn Sie Boost haben, können Sie die Ganzzahl mit in eine Zeichenfolge konvertieren
boost::lexical_cast<std::string>(age)
.Eine andere Möglichkeit ist die Verwendung von Stringstreams:
Ein dritter Ansatz wäre die Verwendung von
sprintf
odersnprintf
aus der C-Bibliothek.Andere Poster empfehlen die Verwendung
itoa
. Dies ist KEINE Standardfunktion, daher ist Ihr Code nicht portierbar, wenn Sie ihn verwenden. Es gibt Compiler, die dies nicht unterstützen.quelle
sprintf
nur in der Antwort kein Vorkommen vonsnprintf
.quelle
Schamlos gestohlen von http://www.research.att.com/~bs/bs_faq2.html .
quelle
s
es sich jedoch um eine Stapelvariable handelt, ist der Speicher vons
nach dem Aufruf freiitos
.s
sollte vom Haufen zuordnen, undfree
nach der Verwendung, richtig?Dies ist der einfachste Weg:
quelle
Wenn Sie C ++ 11 haben, können Sie verwenden
std::to_string
.Beispiel:
Ausgabe:
quelle
name += std::to_string(static_cast<long long>(age));
in VC ++ 2010, wie Sie hier sehen könnenname += std::to_string(age + 0LL);
stattdessen?Es scheint mir, dass die einfachste Antwort darin besteht, die
sprintf
Funktion zu verwenden:quelle
quelle
Dann würde Ihre Nutzung ungefähr so aussehen
Googelte [und testete: p]
quelle
Dieses Problem kann auf viele Arten gelöst werden. Ich werde es auf zwei Arten zeigen:
Konvertieren Sie die Zahl mit in eine Zeichenfolge
to_string(i)
.Verwenden von String-Streams.
Code:
quelle
Wenn Sie
+
für die Verkettung von Elementen mit einem Ausgabeoperator verwenden möchten, können Sie eine Vorlagenversion von Folgendem bereitstellenoperator+
:Dann können Sie Ihre Verkettungen auf einfache Weise schreiben:
Ausgabe:
Dies ist nicht der effizienteste Weg, aber Sie benötigen den effizientesten Weg nur, wenn Sie innerhalb einer Schleife viel Verkettung durchführen.
quelle
std::string
und wäre daher kein Kandidat für Ausdrücke, bei denen eine Zeichenfolge nicht in den erforderlichen Typ konvertierbar ist. ZB dasoperator+
verwendet werden soll , nicht für eine+
inint x = 5 + 7;
. Alles in allem würde ich einen solchen Operator nicht ohne einen sehr zwingenden Grund definieren, aber mein Ziel war es, eine andere Antwort als die anderen anzubieten.Wenn Sie MFC verwenden, können Sie einen CString verwenden
Managed C ++ hat auch einen String-Formatierer .
quelle
Der std :: ostringstream ist eine gute Methode, aber manchmal kann dieser zusätzliche Trick nützlich sein, um die Formatierung in einen Einzeiler umzuwandeln:
Jetzt können Sie Zeichenfolgen wie folgt formatieren:
quelle
Da eine Qt-bezogene Frage zugunsten dieser Frage geschlossen wurde, gehen Sie wie folgt vor, um Qt zu verwenden:
Die Zeichenfolgenvariable hat jetzt den Wert von someIntVariable anstelle von% 1 und den Wert von someOtherIntVariable am Ende.
quelle
Es gibt weitere Optionen, mit denen Ganzzahlen (oder andere numerische Objekte) mit Zeichenfolgen verknüpft werden können. Es ist Boost.Format
und Karma von Boost.Spirit (v2)
Boost.Spirit Karma behauptet, eine der schnellsten Optionen für die Konvertierung von Ganzzahlen in Zeichenfolgen zu sein .
quelle
Allgemeine Antwort: itoa ()
Das ist schlecht.
itoa
ist nicht Standard, wie hier ausgeführt .quelle
Sie können int mit dem folgenden einfachen Trick zu einem String verketten. Beachten Sie jedoch, dass dies nur funktioniert, wenn die Ganzzahl einstellig ist. Andernfalls fügen Sie dieser Zeichenfolge eine ganzzahlige Ziffer für Ziffer hinzu.
quelle
Hier finden Sie eine Implementierung zum Anhängen eines Int an eine Zeichenfolge mithilfe der Parsing- und Formatierungsfacetten aus der IOStreams-Bibliothek.
quelle
quelle
Ich habe eine Funktion geschrieben, die die int-Nummer als Parameter verwendet und in ein String-Literal konvertiert. Diese Funktion hängt von einer anderen Funktion ab, die eine einzelne Ziffer in ihr Zeichenäquivalent konvertiert:
quelle
Mit der {fmt} Bibliothek :
Eine Teilmenge der Bibliothek wird zur Standardisierung als P0645-Textformatierung vorgeschlagen. Wenn dies akzeptiert wird, wird Folgendes angezeigt :
Haftungsausschluss : Ich bin der Autor der {fmt} -Bibliothek.
quelle
Als Einzeiler:
name += std::to_string(age);
quelle