So verketten Sie einen std::string und einen int

Lesezeit: 1 Minute

So verketten Sie einen stdstring und einen int
Obedia Stane

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 Saite zu erhalten? "John21"?

  • Herb Sutter hat einen guten Artikel zu diesem Thema: “Die String-Formatierer von Manor Farm”. Er deckt Boost::lexical_cast, std::stringstream, std::strstream (was veraltet ist) und sprintf vs. snprintf.

    – Fred Larson

    10. Oktober 2008 um 16:54 Uhr


  • Lassen Sie mich hinzufügen: Ich habe versucht, ‘str = “hi”; str += 5; cout <

    – daveagp

    25. Oktober 2014 um 20:00 Uhr


So verketten Sie einen stdstring und einen int
Danny T

In alphabetischer Reihenfolge:

std::string name = "John";
int age = 21;
std::string result;

// 1. with Boost
result = name + boost::lexical_cast<std::string>(age);

// 2. with C++11
result = name + std::to_string(age);

// 3. with FastFormat.Format
fastformat::fmt(result, "{0}{1}", name, age);

// 4. with FastFormat.Write
fastformat::write(result, name, age);

// 5. with the {fmt} library
result = fmt::format("{}{}", name, age);

// 6. with IOStreams
std::stringstream sstm;
sstm << name << age;
result = sstm.str();

// 7. with itoa
char numstr[21]; // enough to hold all numbers up to 64-bits
result = name + itoa(age, numstr, 10);

// 8. with sprintf
char numstr[21]; // enough to hold all numbers up to 64-bits
sprintf(numstr, "%d", age);
result = name + numstr;

// 9. with STLSoft's integer_to_string
char numstr[21]; // enough to hold all numbers up to 64-bits
result = name + stlsoft::integer_to_string(numstr, 21, age);

// 10. with STLSoft's winstl::int_to_string()
result = name + winstl::int_to_string(age);

// 11. With Poco NumberFormatter
result = name + Poco::NumberFormatter().format(age);
  1. ist sicher, aber langsam; erfordert Schub (nur Kopfzeile); die meisten/alle Plattformen
  2. ist sicher, erfordert C++11 (to_string() ist bereits drin #include <string>)
  3. ist sicher und schnell; erfordert FastFormat, die kompiliert werden müssen; die meisten/alle Plattformen
  4. (dito)
  5. ist sicher und schnell; erfordert die {fmt}-Bibliothek, die entweder kompiliert oder nur im Header-Modus verwendet werden kann; die meisten/alle Plattformen
  6. sicher, langsam und ausführlich; erfordert #include <sstream> (aus Standard-C++)
  7. ist spröde (Sie müssen einen Puffer bereitstellen, der groß genug ist), schnell und ausführlich; itoa() ist eine Nicht-Standard-Erweiterung und nicht garantiert für alle Plattformen verfügbar
  8. ist spröde (Sie müssen einen Puffer bereitstellen, der groß genug ist), schnell und ausführlich; erfordert nichts (ist Standard-C++); alle Plattformen
  9. ist spröde (Sie müssen einen ausreichend großen Puffer bereitstellen), wahrscheinlich die schnellstmögliche Konvertierung, ausführlich; erfordert STLSoft (nur Kopfzeile); die meisten/alle Plattformen
  10. sicher (Sie verwenden nicht mehr als eine int_to_string() Aufruf in einer einzigen Anweisung), schnell; erfordert STLSoft (nur Kopfzeile); Nur Windows
  11. ist sicher, aber langsam; erfordert Poco C++ ; die meisten/alle Plattformen

  • Abgesehen von dem einen Link, den Sie angegeben haben, worauf stützen Sie Ihre Leistungskommentare?

    – JamieH

    22. Mai 2009 um 21:45 Uhr

  • Das ist fast Ihr gesamter Ruf aus einer einzigen Antwort!! Du Glückspilz 😉 Ich denke, 8 ist Standard-C (natürlich auch C++), aber wahrscheinlich eine Unterscheidung wert.

    – noelikus

    16. August 2018 um 11:54 Uhr

  • 2. ist langsam, da std::to_string(age) einen temporären String erstellt, der an das Ergebnis angehängt wird.

    – Igor Bukanov

    15. September 2019 um 9:49 Uhr

  • Wenn Sie auf Arduino sind, können Sie auch verwenden String(number).

    – Machado

    19. April 2020 um 8:04 Uhr

  • Ich würde vielleicht auch snprintf anstelle von sprintf hinzufügen.

    – rjhcnf

    13. Mai 2021 um 9:25 Uhr

1647159609 175 So verketten Sie einen stdstring und einen int
Jeremy

In C++11 können Sie verwenden std::to_stringz.B:

auto result = name + std::to_string( age );

  • das Gleiche wie vorher.

    – Gumuruh

    27. Januar um 7:06 Uhr

1647159610 315 So verketten Sie einen stdstring und einen int
Jay Conrod

Wenn Sie Boost haben, können Sie die Ganzzahl mit in einen String umwandeln boost::lexical_cast<std::string>(age).

Eine andere Möglichkeit ist die Verwendung von Stringstreams:

std::stringstream ss;
ss << age;
std::cout << name << ss.str() << std::endl;

Ein dritter Ansatz wäre zu verwenden sprintf oder snprintf aus der C-Bibliothek.

char buffer[128];
snprintf(buffer, sizeof(buffer), "%s%d", name.c_str(), age);
std::cout << buffer << std::endl;

Andere Poster schlugen die Verwendung vor itoa. Dies ist KEINE Standardfunktion, daher ist Ihr Code nicht portierbar, wenn Sie ihn verwenden. Es gibt Compiler, die das nicht unterstützen.

  • Beachten Sie, dass snprintf die Zeichenfolge nicht garantiert mit Null beendet. Hier ist eine Möglichkeit, um sicherzustellen, dass es funktioniert:

     char buffer[128];  Puffer[sizeof(buffer)-1] = '\0';  snprintf(buffer, sizeof(buffer)-1, "%s%d", name.c_str(), alter);  std::cout << Puffer << std::endl;  

    – Herr Fooz

    10. Oktober 2008 um 16:06 Uhr

  • Meine Tendenz wäre, sprintf niemals zu verwenden, da dies zu Pufferüberläufen führen kann. Das obige Beispiel ist ein gutes Beispiel dafür, wo die Verwendung von sprintf unsicher wäre, wenn der Name sehr lang wäre.

    – terson

    11. Oktober 2008 um 18:06 Uhr

  • Beachten Sie, dass snprintf ebenso kein Standard-C++ ist (wie itoa, das Sie erwähnen). es ist von c99 übernommen

    – Johannes Schaub - litb

    9. Februar 2009 um 3:36 Uhr

  • @terson: Ich sehe kein Vorkommen von sprintf nur in der Antwort snprintf.

    – David Förster

    3. Juli 2013 um 18:07 Uhr

1647159610 613 So verketten Sie einen stdstring und einen int
Ben Hoffstein

#include <iostream>
#include <sstream>

std::ostringstream o;
o << name << age;
std::cout << o.str();

1647159610 678 So verketten Sie einen stdstring und einen int
Schluck

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string itos(int i) // convert int to string
{
    stringstream s;
    s << i;
    return s.str();
}

Schamlos gestohlen http://www.research.att.com/~bs/bs_faq2.html.

  • aber s ist ein Stack-Variablen, der Speicher von s wird nach dem Aufruf frei sein itos. s sollte vom Haufen zuweisen, und free nach dem Gebrauch, oder?

    – kgbook

    10. September 2018 um 7:29 Uhr


  • Die Rückgabe nach Wert ist in Ordnung, obwohl das Zeichenfolgenobjekt den Gültigkeitsbereich verlassen hat, stackoverflow.com/a/3977119/5393174

    – kgbook

    10. September 2018 um 8:18 Uhr

  • Der Link ist kaputt: "Seite nicht gefunden"

    – Peter Mortensen

    17. Mai 2021 um 14:41 Uhr

1647159611 189 So verketten Sie einen stdstring und einen int
Kevin

Dies ist der einfachste Weg:

string s = name + std::to_string(age);

  • aber s ist ein Stack-Variablen, der Speicher von s wird nach dem Aufruf frei sein itos. s sollte vom Haufen zuweisen, und free nach dem Gebrauch, oder?

    – kgbook

    10. September 2018 um 7:29 Uhr


  • Die Rückgabe nach Wert ist in Ordnung, obwohl das Zeichenfolgenobjekt den Gültigkeitsbereich verlassen hat, stackoverflow.com/a/3977119/5393174

    – kgbook

    10. September 2018 um 8:18 Uhr

  • Der Link ist kaputt: "Seite nicht gefunden"

    – Peter Mortensen

    17. Mai 2021 um 14:41 Uhr

So verketten Sie einen stdstring und einen int
Azeem

Wenn Sie C++11 haben, können Sie verwenden std::to_string.

Beispiel:

std::string name = "John";
int age = 21;

name += std::to_string(age);

std::cout << name;

Ausgabe:

John21

  • Es wäre name += std::to_string(static_cast<long long>(age)); in VC++ 2010, wie Sie hier sehen können

    – Neonkamerad

    27. Mai 2014 um 15:40 Uhr


  • @neonmate Wie wäre es name += std::to_string(age + 0LL); stattdessen?

    – chux – Wiedereinsetzung von Monica

    7. Oktober 2016 um 19:22 Uhr

  • tolle lösung. Danke

    – Schofiullah Babor

    9. November 2021 um 14:44 Uhr

996620cookie-checkSo verketten Sie einen std::string und einen int

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy