Alternative zu itoa() zum Konvertieren von Integer in String C++? [duplicate]

Lesezeit: 7 Minuten

Alternative zu itoa zum Konvertieren von Integer in String C
Tomek

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.

  • 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


1646872810 960 Alternative zu itoa zum Konvertieren von Integer in String C
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

  • Ich vermute du meinst: cppreference.com/cppsstream/all.html

    – Wodin

    15. Dezember 2010 um 9:07 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


1646872811 990 Alternative zu itoa zum Konvertieren von Integer in String C
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

1646872811 649 Alternative zu itoa zum Konvertieren von Integer in String C
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

1646872811 96 Alternative zu itoa zum Konvertieren von Integer in String C
Patryk

С++11 behebt diese Bereitstellung schließlich std::to_string. Ebenfalls boost::lexical_cast ist ein praktisches Werkzeug für ältere Compiler.

985270cookie-checkAlternative zu itoa() zum Konvertieren von Integer in String C++? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy