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"
?
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"
?
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.
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 .
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"
}
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.
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 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.
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) undsprintf
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.