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.

6voto

uckelman Punkte 24070

Wenn Sie Folgendes verwenden möchten + für die Verkettung von allem, was einen Ausgabeoperator hat, können Sie eine Vorlageversion von operator+ :

template <typename L, typename R> std::string operator+(L left, R right) {
  std::ostringstream os;
  os << left << right;
  return os.str();
}

Dann können Sie Ihre Verkettungen auf einfache Weise schreiben:

std::string foo("the answer is ");
int i = 42;
std::string bar(foo + i);    
std::cout << bar << std::endl;

出力します。

the answer is 42

Das ist zwar nicht die effizienteste Methode, aber die brauchen Sie auch nicht, es sei denn, Sie führen eine Menge Verkettungen innerhalb einer Schleife durch.

5voto

bsruth Punkte 5164

Wenn Sie die MFC verwenden, können Sie einen CString

CString nameAge = "";
nameAge.Format("%s%d", "John", 21);

Managed C++ hat auch eine String-Formatierer .

4voto

Pyry Jahkola Punkte 603

Der std::ostringstream ist eine gute Methode, aber manchmal kann dieser zusätzliche Trick nützlich sein, um die Formatierung in einen Einzeiler zu verwandeln:

#include <sstream>
#define MAKE_STRING(tokens) /****************/ \
    static_cast<std::ostringstream&>(          \
        std::ostringstream().flush() << tokens \
    ).str()                                    \
    /**/

Jetzt können Sie Zeichenketten wie folgt formatieren:

int main() {
    int i = 123;
    std::string message = MAKE_STRING("i = " << i);
    std::cout << message << std::endl; // prints: "i = 123"
}

4voto

leinir Punkte 902

Da eine Qt-bezogene Frage zugunsten dieser Frage geschlossen wurde, hier eine Anleitung, wie man es mit Qt macht:

QString string = QString("Some string %1 with an int somewhere").arg(someIntVariable);
string.append(someOtherIntVariable);

Die String-Variable hat nun den Wert von someIntVariable anstelle von %1 und den Wert von someOtherIntVariable am Ende.

3voto

mloskot Punkte 34861

Es gibt noch weitere Optionen für die Verkettung von Integer (oder anderen numerischen Objekten) mit String. Es ist Boost.Format

#include <boost/format.hpp>
#include <string>
int main()
{
    using boost::format;

    int age = 22;
    std::string str_age = str(format("age is %1%") % age);
}

und Karma von Boost.Spirit (v2)

#include <boost/spirit/include/karma.hpp>
#include <iterator>
#include <string>
int main()
{
    using namespace boost::spirit;

    int age = 22;
    std::string str_age("age is ");
    std::back_insert_iterator<std::string> sink(str_age);
    karma::generate(sink, int_, age);

    return 0;
}

Boost.Spirit Karma behauptet, einer der schnellste Option für Integer zu String Umwandlung.

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