Wie man std::string und int in C++ verknüpft: Nicht offensichtliche Fallstricke
\n\nHaben Sie jemals so etwas wie "Hallo" + 42 in C++ geschrieben und anstelle des erwarteten "Hallo42" eine seltsame Zeichenfolge erhalten? Wenn ja, sind Sie nicht allein. Diese Frage auf Stack Overflow hat Zehntausende von Aufrufen, und das aus gutem Grund. In C++ ist die Verkettung eines Strings und einer Zahl keine so triviale Aufgabe wie in Python oder JavaScript. Hier müssen Sie ein paar Tricks kennen.
In diesem Artikel behandeln wir 4 Methoden zur Konkatenation von std::string und int, von der einfachsten bis zur professionellen. Sie erfahren, warum str + num nicht funktioniert, wie Sie diese Einschränkung umgehen und welche Methode Sie für Ihre Aufgabe wählen sollten. Los geht's!
Warum funktioniert str + int nicht? Kurz zu den Typen
\n\nIn C++ ist std::string eine Klasse und int ein eingebauter numerischer Typ. Der Operator + ist für std::string überladen, erwartet aber einen zweiten Operanden ebenfalls vom Typ String (std::string, const char* oder ein Zeichen). Wenn Sie "Hallo" + 42 schreiben, versucht der Compiler, 42 als arithmetischen Offset für einen Zeiger auf ein String-Literal zu interpretieren, nicht als Zahl zum Einfügen.
Das Ergebnis? Undefiniertes Verhalten, Programmabsturz oder Datenmüll im Speicher. Deshalb brauchen wir spezielle Konvertierungsmethoden.
\n\nMethode 1: std::to_string – die einfachste (C++11 und neuer)
\n\nSeit C++11 gibt es in der Standardbibliothek die praktische Funktion std::to_string. Sie wandelt jede Zahl (int, float, double, long usw.) in einen std::string um. Danach folgt die einfache Verkettung zweier Strings.
#include <iostream>\n#include <string>\n\nint main() {\n std::string text = "Die Zahl Pi ist ungefähr ";\n int pi_int = 3;\n\n // int in String umwandeln und verketten\n std::string result = text + std::to_string(pi_int);\n std::cout << result << std::endl; // Ausgabe: Die Zahl Pi ist ungefähr 3\n\n // Kann auch direkt in einer Zeile erfolgen\n std::cout << "Antwort: " + std::to_string(42) << std::endl;\n\n return 0;\n}\n\nVorteile: lesbar, kurz, keine zusätzlichen Bibliotheken erforderlich (außer <string>).
\nNachteile: keine Formatierungskontrolle (Anzahl der Nachkommastellen, führende Nullen).
Methode 2: std::ostringstream – der König der Formatierung
\n\nWenn Sie die Zahl nicht nur verketten, sondern auch formatieren möchten (führende Nullen hinzufügen, den Dezimalteil begrenzen), verwenden Sie std::ostringstream aus der Header-Datei <sstream>. Dieser Ansatz ahmt die Funktionsweise von cout nach, speichert das Ergebnis jedoch in einem String.
#include <iostream>\n#include <sstream>\n#include <string>\n#include <iomanip> // für std::setw und std::setfill\n\nint main() {\n int user_id = 7;\n std::ostringstream oss;\n\n // Formatieren: ID mit führenden Nullen auf 3 Stellen\n oss << "Benutzer #" << std::setw(3) << std::setfill('0') << user_id;\n std::string formatted = oss.str();\n\n std::cout << formatted << std::endl; // Ausgabe: Benutzer #007\n\n // Komplexeres Beispiel: Dezimalzahl\n double price = 19.5;\n std::ostringstream oss2;\n oss2 << "Preis: " << std::fixed << std::setprecision(2) << price << " EUR.";\n std::cout << oss2.str() << std::endl; // Ausgabe: Preis: 19.50 EUR.\n\n return 0;\n}\n\nVorteile: volle Formatierungskontrolle, funktioniert mit allen Typen.
\nNachteile: ausführlicherer Code, <sstream> und <iomanip> müssen eingebunden werden.
Methode 3: sprintf / snprintf – das C-Erbe (Vorsicht!)
\n\nWenn Sie mit altem Code arbeiten oder aus irgendeinem Grund kein