Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich habe mich gefragt, ob es eine Alternative für die Umwandlung eine ganze Zahl in eine Zeichenfolge zu itoa() war, weil, wenn ich es in Visual Studio betreibe ich Warnungen erhalten, und wenn ich versuche, mein Programm unter Linux zu bauen, ich einen Kompilierungsfehler erhalten.

War es hilfreich?

Lösung

In C ++ 11 können Sie verwenden std::to_string :

#include <string>

std::string s = std::to_string(5);

Wenn Sie mit 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 /

Andere Tipps

boost :: lexical_cast ziemlich gut funktioniert.

#include <boost/lexical_cast.hpp>
int main(int argc, char** argv) {
    std::string foo = boost::lexical_cast<std::string>(argc);
}

Archäologie

itoa war eine Nicht-Standard-Hilfsfunktion entwickelt, um die atoi Standardfunktion, zu ergänzen und wahrscheinlich ein sprintf versteckt (die meisten ihrer Funktionen können in Bezug auf die sprintf implementiert werden): http://www.cplusplus.com/reference/clibrary/cstdlib/itoa.html

Die C Way

Mit sprintf. Oder snprintf. Oder was auch immer Werkzeug, das Sie finden.

Trotz der Tatsache, einige Funktionen sind in der Norm nicht, wie zu Recht von „OneByOne“ in einem seiner Kommentare erwähnt, werden die meisten Compiler bieten Ihnen eine Alternative (zB Visual C ++ seine eigene _snprintf hat, können Sie typedef snprintf wenn Sie brauchen it).

Die C ++ Art und Weise.

Mit dem C ++ Streams (im aktuellen Fall std :: string (oder sogar die veraltete std :: Strstream, wie von Herb Sutter in eines seiner Büchern vorgeschlagen, weil es etwas schneller ist).

Fazit

Sie sind in C ++, was bedeutet, dass Sie den Weg wählen, können Sie es wollen:

  • Der schnellere Weg (dh der C Art und Weise), aber Sie sollten den Code sicher sein, ein Engpass in Ihrer Anwendung (vorzeitige Optimierungen sind böse, etc.) und dass der Code sicher Puffer Überschreitungen zu vermeiden eingekapselt riskiert .

  • Der sicherere Weg (dh der C ++ Art und Weise), wenn Sie diesen Teil des Codes wissen nicht kritisch ist, so besser, dass dieser Teil des Codes nicht zufällig Momente brechen wird, weil jemand eine Größe verwechselte oder ein Zeiger (was im realen Leben geschieht, wie ... gestern auf meinem Computer, weil jemand es gedacht, „cool“ die schnellere Art und Weise zu nutzen, ohne sie wirklich zu benötigen).

Versuchen sprintf ():

char str[12];
int num = 3;
sprintf(str, "%d", num); // str now contains "3"

sprintf () ist wie printf (), aber Ausgänge in einen String.

Auch als Parappa in den Kommentaren erwähnt, möchten Sie vielleicht snprintf () verwenden, um einen Pufferüberlauf zu stoppen auftreten (wo die Zahl Sie konvertieren nicht die Größe der Zeichenfolge passt.) Es funktioniert wie folgt :

snprintf(str, sizeof(str), "%d", num);

Hinter den Kulissen lexical_cast tut dies:

std::stringstream str;
str << myint;
std::string result;
str >> result;

Wenn Sie nicht wollen, zu „drag in“ Boost für diese, dann die oben ist eine gute Lösung.

Wir können unsere eigene iota Funktion in C ++ wie definieren:

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;
}

Vergessen Sie nicht #include <string>.

С ++ 11 schließlich löst dieses Problem bietet std::to_string . Auch boost::lexical_cast ist handliches Werkzeug für ältere Compiler.

Ich verwende diese Vorlagen

template <typename T> string toStr(T tmp)
{
    ostringstream out;
    out << tmp;
    return out.str();
}


template <typename T> T strTo(string tmp)
{
    T output;
    istringstream in(tmp);
    in >> output;
    return output;
}

Versuchen Sie Boost.Format oder FastFormat , sowohl qualitativ hochwertige C ++ Bibliotheken:

int i = 10;
std::string result;

Boost.Format

result = str(boost::format("%1%", i));

oder FastFormat

fastformat::fmt(result, "{0}", i);
fastformat::write(result, i);

Natürlich tun sie beide viel mehr als eine einfache Umwandlung eines einzelnen integer

Sie können tatsächlich etwas in einen String mit einer geschickt geschrieben Template-Funktion konvertieren. Dieses Codebeispiel verwendet eine Schleife Unterverzeichnisse in einem Win-32-System zu erstellen. Der String Verkettungsoperator, operator +, verwendet, um eine Wurzel mit einem Suffix verketten, um Verzeichnisnamen zu erzeugen. Das Suffix wird durch Umwandlung der Schleifensteuerungsvariable erstellt, i, zu einem C ++ Zeichenfolge, mit der Template-Funktion, und Verketten des mit einer anderen Zeichenkette.

//Mark Renslow, Globe University, Minnesota School of Business, Utah Career College
//C++ instructor and Network Dean of Information Technology

#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream> // string stream
#include <direct.h>

using namespace std;

string intToString(int x)
{
/**************************************/
/* This function is similar to itoa() */
/* "integer to alpha", a non-standard */
/* C language function. It takes an   */
/* integer as input and as output,    */
/* returns a C++ string.              */
/* itoa()  returned a C-string (null- */
/* terminated)                        */
/* This function is not needed because*/
/* the following template function    */
/* does it all                        */
/**************************************/   
       string r;
       stringstream s;

       s << x;
       r = s.str();

       return r;

}

template <class T>
string toString( T argument)
{
/**************************************/
/* This template shows the power of   */
/* C++ templates. This function will  */
/* convert anything to a string!      */
/* Precondition:                      */
/* operator<< is defined for type T    */
/**************************************/
       string r;
       stringstream s;

       s << argument;
       r = s.str();

       return r;

}

int main( )
{
    string s;

    cout << "What directory would you like me to make?";

    cin >> s;

    try
    {
      mkdir(s.c_str());
    }
    catch (exception& e) 
    {
      cerr << e.what( ) << endl;
    }

    chdir(s.c_str());

    //Using a loop and string concatenation to make several sub-directories
    for(int i = 0; i < 10; i++)
    {
        s = "Dir_";
        s = s + toString(i);
        mkdir(s.c_str());
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}

Vergeben Sie einen String mit ausreichender Länge, dann snprintf verwenden.

Die beste Antwort, IMO, ist die Funktion hier zu finden:

http://www.jb.man.ac.uk /~slowe/cpp/itoa.html

Es ahmt die Nicht-ANSI-Funktion von vielen Bibliotheken zur Verfügung gestellt.

char* itoa(int value, char* result, int base);

Es ist auch blitzschnell und optimiert auch unter O3, und der Grund Sie nicht mit C ++ string_format () ... oder sprintf ist, dass sie zu langsam sind, nicht wahr?

Beachten Sie, dass alle der stringstream Methoden können Sperren rund um die Nutzung des Lokals Objekt für die Formatierung beinhalten. Das können etwas vorsichtig sein, wenn Sie diese Konvertierung von mehreren Threads verwenden ...

Sehen Sie hier für mehr. Convert eine Zahl in einen String mit der angegebenen Länge in C ++

int number = 123;

stringstream = s;

s << number;

cout << ss.str() << endl;

Wenn Sie in schnell Interesse sowie sichere integer zu String-Umwandlungsverfahren und nicht auf die Standard-Bibliothek beschränkt, kann ich die FormatInt Methode aus dem C ++ Format Bibliothek:

fmt::FormatInt(42).str();   // convert to std::string
fmt::FormatInt(42).c_str(); // convert and get as a C string
                            // (mind the lifetime, same as std::string::c_str())

Nach dem integer zu String-Konvertierung Benchmarks von Boost-Karma, dieses Verfahren mehrmals schneller als glibc sprintf oder std::stringstream. Es ist sogar schneller als eigenen int_generator der Erhöhung Karma wie war bestätigen durch eine unabhängiger Benchmark .

Disclaimer:. Ich bin der Autor dieser Bibliothek

Ich schrieb dieses thread-safe vor einiger Zeit funktioniert, und ich bin sehr zufrieden mit den Ergebnissen und fühlen der Algorithmus ist leicht und schlank, mit Leistung, die etwa 3X ist die Standard-MSVC _itoa () Funktion .

Hier ist der Link. Optimale Basis 10 nur itoa () -Funktion? Leistung ist mindestens 10fach, dass von sprintf (). Die Benchmark ist auch die QA-Test-Funktion, wie folgt.

start = clock();
for (int i = LONG_MIN; i < LONG_MAX; i++) {
    if (i != atoi(_i32toa(buff, (int32_t)i))) {
        printf("\nError for %i", i);
    }
    if (!i) printf("\nAt zero");
}
printf("\nElapsed time was %f milliseconds", (double)clock() - (double)(start));

Es gibt einige dumme Vorschläge gemacht über die Anrufer-Speicher mit, der das Ergebnis floating irgendwo in einem Puffer in der Anruferadressraum verlassen würde. Ignoriere sie. Der Code, den ich funktioniert perfekt aufgeführt, wie der Benchmark / QA-Code demonstriert.

Ich glaube, dass dieser Code mager genug ist, in einer eingebetteten Umgebung zu verwenden. YMMV, natürlich.

Unter Windows CE abgeleiteten Plattformen gibt es keine iostreams standardmäßig. Der Weg dorthin zu gehen, ist preferaby mit der _itoa<> Familie, in der Regel _itow<> (da die meisten String stuff Unicode es sowieso).

Die meisten der oben genannten Vorschläge technisch nicht C ++, sind sie C-Lösungen.

Schauen Sie in die Verwendung von std :: string .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top