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"
?
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"
?
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);
#include <string>
)#include <sstream>
(aus Standard-C++)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
Jeremy
In C++11 können Sie verwenden std::to_string
z.B:
auto result = name + std::to_string( age );
das Gleiche wie vorher.
– Gumuruh
27. Januar um 7:06 Uhr
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
Ben Hoffstein
#include <iostream>
#include <sstream>
std::ostringstream o;
o << name << age;
std::cout << o.str();
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
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
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
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) undsprintf
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