790 Stimmen

Verkettung eines std::string und eines int

Ich dachte, das wäre ganz einfach, aber es gibt einige Schwierigkeiten. Wenn ich

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

Wie kombiniere ich sie, um eine einzige Zeichenfolge zu erhalten? "John21" ?

1 Stimmen

Herb Sutter hat einen guten Artikel zu diesem Thema: "Die Streichinstrumentenbauer von Manor Farm" . Er deckt Boost::lexical_cast , std::stringstream , std::strstream (die veraltet ist) und sprintf vs. snprintf .

1 Stimmen

Lassen Sie mich dies noch ergänzen: Ich habe 'str = "hi"; str += 5; cout << str;' ausprobiert und keinen Effekt gesehen. Es stellte sich heraus, dass dies operator+=(char) aufruft und ein nicht druckbares Zeichen hinzufügt.

1374voto

DannyT Punkte 13319

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 Boost (nur Kopfzeile); die meisten/alle Plattformen
  2. ist sicher, erfordert C++11 ( to_string() ist bereits enthalten in #include <string> )
  3. ist sicher und schnell; erfordert FastFormat , die kompiliert werden muss; die meisten/alle Plattformen
  4. ( dito )
  5. ist sicher und schnell; erfordert die {fmt}-Bibliothek , die entweder kompiliert oder im reinen Header-Modus verwendet werden kann; die meisten/alle Plattformen
  6. sicher, langsam und ausführlich; erfordert #include <sstream> (aus dem Standard C++)
  7. ist spröde (Sie müssen einen ausreichend großen Puffer bereitstellen), schnell und ausführlich; itoa() ist eine Nicht-Standard-Erweiterung und garantiert nicht für alle Plattformen verfügbar
  8. ist spröde (Sie müssen einen ausreichend großen Puffer bereitstellen), schnell und ausführlich; benötigt nichts (ist Standard-C++); alle Plattformen
  9. spröde ist (Sie müssen einen ausreichend großen Puffer bereitstellen), die wahrscheinlich schnellstmögliche Umsetzung , verbose; 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 für Windows
  11. ist sicher, aber langsam; erfordert Poco C++ die meisten/alle Plattformen

323voto

Jeremy Punkte 4549

In C++11 können Sie mit std::to_string , z.B.:

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

92voto

Jay Conrod Punkte 27696

Wenn Sie Boost haben, können Sie die Ganzzahl in eine Zeichenkette konvertieren, indem Sie 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 die Verwendung von sprintf o 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 von itoa . Dies ist KEINE Standardfunktion, so dass Ihr Code nicht portabel ist, wenn Sie sie verwenden. Es gibt Compiler, die sie nicht unterstützen.

84voto

Ben Hoffstein Punkte 99969
#include <iostream>
#include <sstream>

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

60voto

tloach Punkte 8001
#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 von http://www.research.att.com/~bs/bs_faq2.html .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X