Ich habe mich gefragt, ob es eine Alternative dazu gibt itoa()
zum Konvertieren einer Ganzzahl in eine Zeichenfolge, denn wenn ich sie in Visual Studio ausführe, erhalte ich Warnungen, und wenn ich versuche, mein Programm unter Linux zu erstellen, erhalte ich einen Kompilierungsfehler.
Alternative zu itoa() zum Konvertieren von Integer in String C++? [duplicate]
Tomek
spoulson
In C++11 können Sie verwenden std::to_string
:
#include <string>
std::string s = std::to_string(5);
Wenn Sie mit einer Version vor C++11 arbeiten, können Sie C++-Streams verwenden:
#include <sstream>
int i = 5;
std::string s;
std::stringstream out;
out << i;
s = out.str();
Genommen von http://notfaq.wordpress.com/2006/08/30/c-convert-int-to-string/
-
Schade, dass von Windows CE abgeleitete Plattformen standardmäßig keine Iostreams haben. Der Weg dorthin führt am besten mit der Familie _itoa<>.
– Johann Gerell
23. Oktober 2008 um 17:31 Uhr
-
Wie löscht man den Stringstream?
– Tomek
23. Oktober 2008 um 19:31 Uhr
-
net.pku.edu.cn/~course/cs101/resource/www.cppreference.com/…
– spoulson
24. Oktober 2008 um 17:30 Uhr
-
-
Stringstream ist nett, aber seien Sie sich bewusst, dass es das kann dramatisch Erhöhen Sie die Größe der ausführbaren Datei.
– Jay
31. Januar 2013 um 16:48 Uhr
boost::lexical_cast funktioniert ziemlich gut.
#include <boost/lexical_cast.hpp>
int main(int argc, char** argv) {
std::string foo = boost::lexical_cast<std::string>(argc);
}
-
Nehmen Sie die Boost-Bibliothek für eine einzelne Besetzung. 🙁
– Chad Stewart
13. Januar 2010 um 20:29 Uhr
-
Aber wenn Sie Boost bereits verwenden, ist es ein Werbegeschenk.
– Chris K
30. Mai 2010 um 13:50 Uhr
-
boost::lexical_cast ist quälend langsam. Verwenden Sie es nicht, wenn die Leistung wichtig ist.
– Matthias N.
2. November 2010 um 5:02 Uhr
-
Ich denke, sich darüber Sorgen zu machen, ist in den meisten Fällen eine verfrühte Optimierung. Es würde mich nicht davon abhalten, es zu verwenden, es sei denn, mein Profiler hat mir etwas anderes gesagt.
– Leon Timmermans
4. November 2010 um 18:22 Uhr
-
Schmerzhaft langsam? Woher hast du das? Es funktioniert tatsächlich ziemlich gut! boost.org/doc/libs/1_49_0/doc/html/boost_lexical_cast/…
– kralyk
27. April 2012 um 23:34 Uhr
paercebal
Archäologie
itoa war eine nicht standardmäßige Hilfsfunktion, die zur Ergänzung der atoi-Standardfunktion entwickelt wurde und wahrscheinlich ein sprintf versteckt (die meisten seiner Funktionen können in Bezug auf sprintf implementiert werden): http://www.cplusplus.com/reference/clibrary/cstdlib/itoa.html
Der C-Weg
Verwenden Sie sprintf. Oder snprintf. Oder welches Werkzeug Sie finden.
Trotz der Tatsache, dass einige Funktionen nicht im Standard sind, wie von “onebyone” in einem seiner Kommentare zu Recht erwähnt, bieten Ihnen die meisten Compiler eine Alternative (z. B. hat Visual C++ sein eigenes _snprintf, das Sie bei Bedarf in snprintf eingeben können).
Der C++-Weg.
Verwenden Sie die C++-Streams (im aktuellen Fall std::stringstream (oder sogar das veraltete std::strstream, wie von Herb Sutter in einem seiner Bücher vorgeschlagen, weil es etwas schneller ist).
Fazit
Sie befinden sich in C++, was bedeutet, dass Sie wählen können, wie Sie es möchten:
-
Der schnellere Weg (dh der C-Weg), aber Sie sollten sicher sein, dass der Code ein Engpass in Ihrer Anwendung ist (vorzeitige Optimierungen sind böse usw.) und dass Ihr Code sicher gekapselt ist, um das Risiko von Pufferüberläufen zu vermeiden.
-
Der sicherere Weg (dh der C++-Weg), wenn Sie wissen, dass dieser Teil des Codes nicht kritisch ist, stellen Sie also besser sicher, dass dieser Teil des Codes nicht in zufälligen Momenten abbricht, weil jemand eine Größe oder einen Zeiger verwechselt hat (was passiert im wirklichen Leben, wie… gestern, auf meinem Computer, weil jemand es “cool” fand, den schnelleren Weg zu benutzen, ohne ihn wirklich zu brauchen).
-
@Chris Kaminski: Meine Tests haben gezeigt, dass der Sprint 5- bis 10-mal schneller war, was die eigenen Messungen von Herb Sutter bestätigt. Wenn Sie Tests mit unterschiedlichen Ergebnissen haben, bin ich interessiert.
– Paercebal
31. Mai 2010 um 9:08 Uhr
-
@Chris Kaminski: Wenn Sie die Schnittstelle des C++-Streams studieren, werden Sie verstehen, warum sie langsamer sind, selbst wenn eine einfache Ganzzahl ausgegeben wird: In C verwenden Sie Ihren eigenen Puffer, der möglicherweise im Stack zugewiesen ist, während in C++ der Stringstream dies tut eigene verwenden. In C können Sie dann Ihren Puffer wiederverwenden. In C++ müssen Sie den String aus dem Stringstream extrahieren, der eine std::string-Kopie ist.
– Paercebal
31. Mai 2010 um 9:10 Uhr
-
@fuzzyTew: Danke für deine Besorgnis, aber ich schätze, ich bin sowohl mit der C-API als auch mit der C++-API vertraut genug, um mit sprintf umzugehen, und weiß, wann (und wie) es sicher zu verwenden ist und wann es überhaupt NICHT zu verwenden ist … 😀
– Paercebal
7. September 2011 um 10:52 Uhr
-
@fuzzyTew:
1
In meinem Beitrag habe ich über sprintf und seine sicheren Varianten gesprochen, nicht nur über sprintf.2
Zu wissen, wo Ihr Code kompiliert ist, ist keine unmögliche Aufgabe (in meinem Fall im schlimmsten Fall Windows/VC++, Solaris/CC und Linux/g++, bestenfalls nur Windows/VC++).3
Sie beschreiben eine Welt, in der Saboteure, die versuchen, Ihren Code zum Absturz zu bringen, die Norm sind. Meine Welt wird von normalen Entwicklern komponiert, daher ist es nicht produktiv, Zeit zu verlieren, wenn ich versuche, meinen Code vor Saboteuren zu schützen, indem ich meine “sichere” Version jeder API umschreibe. […]– Paercebal
8. September 2011 um 11:06 Uhr
-
@fuzzyTew: […]
Conclusion
Verwenden Sie das beste Werkzeug zur Hand. Und wenn das beste Werkzeug ein sprintf ist, das in einer Wrapper-Klasse oder -Funktion versteckt ist … Wenn Sie jetzt das Umschreiben von sprintf als Antwort auf diese Frage befürworten, können Sie gerne Ihre eigene Antwort schreiben. Ich bin mir nicht sicher, ob der Autor der Frage alle Kommentare liest.– Paercebal
8. September 2011 um 11:07 Uhr
Paige Rüten
Probieren Sie sprintf() aus:
char str[12];
int num = 3;
sprintf(str, "%d", num); // str now contains "3"
sprintf() ist wie printf(), gibt aber in einen String aus.
Wie Parappa in den Kommentaren erwähnt hat, möchten Sie möglicherweise auch snprintf() verwenden, um das Auftreten eines Pufferüberlaufs zu verhindern (wobei die Zahl, die Sie konvertieren, nicht zur Größe Ihres Strings passt). Es funktioniert so:
snprintf(str, sizeof(str), "%d", num);
Hinter den Kulissen macht lexical_cast Folgendes:
std::stringstream str;
str << myint;
std::string result;
str >> result;
Wenn Sie dafür keinen Boost “hineinziehen” möchten, ist die Verwendung der oben genannten eine gute Lösung.
-
Ich bezweifle, dass es wann in die Saite strömen würde
str.str()
würde genügen.– sbi
8. August 2013 um 14:23 Uhr
-
Wenn lexical_cast dies tut, wie erklärt sich die große Leistungslücke?
– Nikos Athanasiou
11. Mai 2014 um 8:20 Uhr
-
Hat er das nicht in der Frage erklärt, die Sie so verlinkt haben, dass jedes Mal Stringstream-Objekte erstellt werden?
– 1800 INFORMATIONEN
11. Mai 2014 um 23:45 Uhr
Wir können unsere eigenen definieren iota
Funktion in c++ als:
string itoa(int a)
{
string ss=""; //create empty string
while(a)
{
int x=a%10;
a/=10;
char i='0';
i=i+x;
ss=i+ss; //append new character at the front of the string!
}
return ss;
}
Vergiss es nicht #include <string>
.
-
Ich bezweifle, dass es wann in die Saite strömen würde
str.str()
würde genügen.– sbi
8. August 2013 um 14:23 Uhr
-
Wenn lexical_cast dies tut, wie erklärt sich die große Leistungslücke?
– Nikos Athanasiou
11. Mai 2014 um 8:20 Uhr
-
Hat er das nicht in der Frage erklärt, die Sie so verlinkt haben, dass jedes Mal Stringstream-Objekte erstellt werden?
– 1800 INFORMATIONEN
11. Mai 2014 um 23:45 Uhr
Patryk
С++11 behebt diese Bereitstellung schließlich std::to_string
. Ebenfalls boost::lexical_cast
ist ein praktisches Werkzeug für ältere Compiler.
Im Grunde die Umkehrung dieser Frage. stackoverflow.com/questions/200090/… Die Antwort ist jedoch dieselbe.
– Martin York
23. Oktober 2008 um 3:48 Uhr
Wie wäre es mit einigen der folgenden Beispiele: codeproject.com/KB/recipes/Tokenizer.aspx Sie sind sehr effizient und etwas elegant.
– Matthias N.
2. November 2010 um 4:59 Uhr
Sie können hier einen Benchmark sehen, der 3 moderne C+-Methoden zum Konvertieren von Ganzzahlen in Zeichenfolgen vergleicht
– Nikos Athanasiou
11. Mai 2014 um 8:13 Uhr
Ich hatte die gleiche Anforderung für eine Funktion in C. Ich bin sicher, dass Sie herausfinden können, wie man in C++ umschließt. Es ist Thread-sicher und verarbeitet alle positiven, negativen 32-Bit-Ganzzahlen und Null. Die Leistung ist AUSGEZEICHNET und der Algorithmus ist schlank, sodass er nicht viel Cache verbraucht. Ben Voigt hat einen schnelleren Ansatz, aber es ist kein leichtgewichtiger Algorithmus. Wenn Sie also nicht Milliarden dieser Dinge tun, ist es vielleicht übertrieben.
– Benutzer1899861
1. Juli 2014 um 7:51 Uhr