it-swarm.com.de

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

Ich habe mich gefragt, ob es eine Alternative zu itoa() gibt, um eine Ganzzahl in eine Zeichenfolge zu konvertieren, da ich beim Ausführen in Visual Studio Warnungen erhalte und beim Versuch, mein Programm unter Linux zu erstellen, eine Kompilierung erhalte Error.

140
Tomek

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

#include <string>

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

Wenn Sie mit älteren Versionen als 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();

Entnommen aus http://notfaq.wordpress.com/2006/08/30/c-convert-int-to-string/

172
spoulson

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);
}
54
Leon Timmermans

Archäologie

itoa war eine nicht standardmäßige Hilfsfunktion, die als Ergänzung zur atoi-Standardfunktion entwickelt wurde und wahrscheinlich einen 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 auch finden.

Obwohl einige Funktionen nicht im Standard enthalten sind, wie von "onebyone" in einem seiner Kommentare zu Recht erwähnt, bieten die meisten Compiler eine Alternative an (z. B. verfügt Visual C++ über einen eigenen _snprintf, den Sie bei Bedarf in snprintf eingeben können).

Der C++ Weg.

Verwenden Sie die C++ - Streams (im aktuellen Fall std :: stringstream (oder sogar den veralteten std :: strstream, wie von Herb Sutter in einem seiner Bücher vorgeschlagen, weil er etwas schneller ist).

Fazit

Sie befinden sich in C++, das heißt, Sie können wählen, wie Sie es möchten:

  • Der schnellere Weg (d. H. 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.

  • Die sicherere Methode (dh die C++ - Methode), wenn Sie wissen, dass dieser Teil des Codes nicht kritisch ist, sollten Sie sicherstellen, dass dieser Teil des Codes nicht in zufälligen Momenten unterbrochen wird, da jemand eine Größe oder einen Zeiger falsch eingegeben 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).

47
paercebal

Versuchen Sie sprintf ():

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

sprintf () ist wie printf (), wird jedoch als String ausgegeben.

Wie Parappa in den Kommentaren erwähnt hat, möchten Sie möglicherweise snprintf () verwenden, um das Auftreten eines Pufferüberlaufs zu verhindern (wobei die Zahl, die Sie konvertieren, nicht zur Größe Ihrer Zeichenfolge passt.).

snprintf(str, sizeof(str), "%d", num);
34
Jeremy Ruten

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 Lösung eine gute Lösung.

20

Wir können unsere eigene iota -Funktion in c ++ definieren 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 nicht #include <string>.

10
Tag318

С ++ 11 behebt schließlich dieses Problem, indem std::to_string . Ebenfalls boost::lexical_cast ist ein nützliches Werkzeug für ältere Compiler.

9
Vasaka

Ich benutze 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;
}
8
jm1234567890

Versuchen Sie Boost.Format oder FastFormat , beide hochwertige C++ - Bibliotheken:

int i = 10;
std::string result;

Mit Boost.Format

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

oder FastFormat

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

Offensichtlich machen beide viel mehr als eine einfache Umwandlung einer einzelnen Ganzzahl

6
dcw

Mit einer cleveren Template-Funktion können Sie alles in einen String umwandeln. In diesem Codebeispiel wird eine Schleife zum Erstellen von Unterverzeichnissen in einem Win-32-System verwendet. Der Zeichenfolgenverkettungsoperator operator + wird verwendet, um einen Stamm mit einem Suffix zu verketten, um Verzeichnisnamen zu generieren. Das Suffix wird erstellt, indem die Schleifensteuerungsvariable i mit der Vorlagenfunktion in eine C++ - Zeichenfolge konvertiert und mit einer anderen Zeichenfolge verkettet wird.

//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;
}
6
Mark Renslow

Ordnen Sie eine Zeichenfolge mit ausreichender Länge zu und verwenden Sie dann snprintf.

3
Iain

Die beste Antwort, IMO, ist die hier bereitgestellte Funktion:

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

Es ahmt die Nicht-ANSI-Funktion vieler Bibliotheken nach.

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

Es ist auch blitzschnell und optimiert gut unter -O3, und der Grund, warum Sie nicht c ++ string_format () verwenden ... oder sprintf ist, dass sie zu langsam sind, oder?

2
Erik Aronesty

Ich habe diese thread-sichere Funktion vor einiger Zeit geschrieben und bin sehr zufrieden mit den Ergebnissen und dem Gefühl, dass der Algorithmus leicht und schlank ist, mit einer Leistung, die ungefähr ist 3X die Standard MSVC _itoa () Funktion.

Hier ist der Link. Optimale Base-10-Funktion nur für itoa ()? Die Leistung beträgt mindestens das 10-fache der von sprintf (). Der Benchmark ist auch der QS-Test der 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 zur Verwendung des Speichers des Anrufers, die das Ergebnis irgendwo in einem Puffer im Adressraum des Anrufers schweben lassen würden. Ignoriere sie. Der von mir aufgeführte Code funktioniert einwandfrei, wie der Benchmark/QA-Code zeigt.

Ich glaube, dieser Code ist schlank genug, um in einer eingebetteten Umgebung verwendet zu werden. YMMV natürlich.

1
user1899861
int number = 123;

stringstream = s;

s << number;

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

Beachten Sie, dass bei allen stringstream -Methoden möglicherweise die Verwendung des Gebietsschemaobjekts zum Formatieren gesperrt wird. Dies kann ein Grund zur Vorsicht sein, wenn Sie diese Konvertierung aus mehreren Threads verwenden ...

Sehen Sie hier für mehr. Konvertiert eine Zahl in eine Zeichenfolge mit der angegebenen Länge in C++

1
Len Holgate

Wenn Sie an einer schnellen und sicheren Konvertierungsmethode für Ganzzahlen in Zeichenfolgen interessiert sind und nicht nur auf die Standardbibliothek beschränkt sind, kann ich die Methode FormatInt aus der Bibliothek C++ Format empfehlen:

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())

Laut den Benchmarks Integer to String Conversion von Boost Karma ist diese Methode um ein Vielfaches schneller als die von glibc sprintf oder std::stringstream. Es ist noch schneller als Boost Karmas eigenes int_generator wie durch einen unabhängigen Benchmark bestätigt wurde .

Haftungsausschluss: Ich bin der Autor dieser Bibliothek.

1
vitaut

Auf Windows CE-abgeleiteten Plattformen gibt es standardmäßig keine iostreams. Der Weg dorthin ist bevorzugt mit dem _itoa<> Familie, normalerweise _itow<> (da die meisten Zeichenfolgen sowieso Unicode sind).

0
Johann Gerell